下面是和快速排序,堆排序,相媲美的归并排序,时间复杂度都为O(nLog2n)。
对于归并排序中出现的递归算法,调用的函数顺序以及如何返回,大家可以访问这个网址来详细理解
http://blog.csdn.net/cinderella_hou/article/details/51763681
个人看了,非常受益。。
1 /* 2 * 归并排序: 先递归分解数列,再合并数列,就是归并。归并排序是稳定的。 3 */ 4 public static void mergSort(int[] a) { 5 6 int[] mergarray = new int[a.length]; // 新建一个临时数组,来存储排序好的组 7 mergSort1(a, 0, a.length - 1, mergarray); 8 9 } 10 11 // 递归分解数列函数,来完成到每一组只有一个数,就是有序的,然后从后往前进行合并即可。 12 public static void mergSort1(int[] a, int min, int max, int[] b) { 13 14 int mid = (min + max) / 2; 15 if (min < max) { 16 mergSort1(a, min, mid, b); // 左边有序 17 mergSort1(a, mid + 1, max, b); // 右边有序 18 merg(a, min, mid, max, b); 19 } 20 } 21 22 // 有序数列合并,从第一组的第一个开始和另外一组的第一个数进行比较,把小的赋值给临时数组,在对应数列中删除这个数。 23 // 循环进行比较,如果有数列为空,则把另一个数列剩余的数都赋值给临时数组即可。 24 public static void merg(int[] a, int min, int mid, int max, int[] b) { 25 26 int i = min, j = mid + 1, k = min; 27 while (i <= mid && j <= max) { 28 if (a[i] < a[j]) 29 b[k++] = a[i++]; 30 else { 31 b[k++] = a[j++]; 32 } 33 } 34 while (i <= mid) { 35 b[k++] = a[i++]; 36 37 } 38 while (j <= max) { 39 b[k++] = a[j++]; 40 } 41 for (int k2 = min; k2 < k; k2++) { 42 a[k2] = b[k2]; 43 44 } 45 46 }
时间: 2024-10-19 15:14:16