归并排序算法

归并排序:

  归并排序将待排序数组A[1..n]成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得到最终排好序的序列

(图片来自百度百科)

 1 package com.wx.demo;
 2 
 3 import java.util.Arrays;
 4 
 5 public class MergeSort {
 6     public static void main(String[] args) {
 7         int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
 8         sort(arr);
 9         System.out.println(Arrays.toString(arr));
10     }
11 
12     public static void sort(int[] arr) {
13         int[] temp = new int[arr.length];// 在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
14         sort(arr, 0, arr.length - 1, temp);
15     }
16 
17     private static void sort(int[] arr, int left, int right, int[] temp) {
18         if (left < right) {
19             int mid = (left + right) / 2;
20             sort(arr, left, mid, temp);// 左边归并排序,使得左子序列有序
21             sort(arr, mid + 1, right, temp);// 右边归并排序,使得右子序列有序
22             merge(arr, left, mid, right, temp);// 将两个有序子数组合并操作
23         }
24     }
25 
26     private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
27         int i = left;// 左序列指针
28         int j = mid + 1;// 右序列指针
29         int t = 0;// 临时数组指针
30         while (i <= mid && j <= right) {
31             if (arr[i] <= arr[j]) {
32                 temp[t++] = arr[i++];
33             } else {
34                 temp[t++] = arr[j++];
35             }
36         }
37         while (i <= mid) {// 将左边剩余元素填充进temp中
38             temp[t++] = arr[i++];
39         }
40         while (j <= right) {// 将右序列剩余元素填充进temp中
41             temp[t++] = arr[j++];
42         }
43         t = 0;
44         // 将temp中的元素全部拷贝到原数组中
45         while (left <= right) {
46             arr[left++] = temp[t++];
47         }
48     }
49 }

 

posted @ 2017-10-19 13:57  Xin.Wang  阅读(160)  评论(0编辑  收藏  举报