归并排序的基本思想是指递归的将待排序数组分为两组,直到无法再分,停止条件中间数m等于左边界或者右边界。如下图所示:
分完之后进行合并,如果两个合并的部分均只有1个元素,那么直接进行比较后交换即可。
如果每个部分拥有多个数据,则进行合并。以{4,6}和{8}合并为例:
先申请一个等长的数组,第一轮各有一个指针指向4和8,选择一个更小的数据填充到新数组中。指针向前移一位,直到两个指针均遍历完所有的数据。
红色的箭头表示本部分已经遍历完毕。
时间复杂度分析:O(NlogN)
代码:
package Sort; public class Merge_Sort { public static void main(String [] args) { int [] a = {6,4,8,9,3,1,2,7,5}; merge(a,0,a.length - 1); for(int y:a) System.out.print(y); } static void merge(int [] a, int i, int j) { int m = ((i + j) / 2); if(m == i || m == j) { if(a[i] > a[j]) { int t = a[j]; a[j] = a[i]; a[i] = t; } } else { merge(a,i,m); merge(a,m+1,j); int [] b = new int [j - i + 1]; int l = i,k = m + 1,o=0; while (l <= m || k <= j) { if (l <= m && k <= j) { if (a[l] < a[k]) { b[o] = a[l]; o++; l++; } else { b[o] = a[k]; o++; k++; } } else if(l > m && k <= j) { b[o] = a[k]; k++; o++; } else { b[o] = a[l]; l++; o++; } } for (int x = 0; x < b.length; x++) { a[i] = b[x]; i++; } } } }