1 基本思想
“归并”的含义是将两个或两个以上的有序表合并称一个新的有序表。假定待排序表含有n个记录,则可将其视为n个有序的子表,每个子表的长度为1,然后两两归并,得到n/2个长度为2或1的有序表;继续两两归并……如此重复,直到合并成一个长度为n的有序表为止,这种排序方法称为2路归并。
2 实例
假设初始序列为50,26,38,30,70,30,则归并排序的过程为
3 算法实现
public static void MergeSort(int[] array,int left,int right){ if(left<right){ int mid=(left+right)/2; MergeSort(array,left,mid); //对左侧子序列进行递归排序 MergeSort(array,mid+1,right); //对右侧子序列进行递归排序 Merge(array,left,mid,right); } } private static void Merge(int[] array,int left,int mid,int right) { int[] array1 = new int[array.length]; int i = left; int j = mid + 1; int k=left; while(i<=mid&&j<=right){ if(array[i]<=array[j]){ array1[k]=array[i]; i++; } else{ array1[k]=array[j]; j++; } k++; } while (i<=mid){ array1[k]=array[i]; i++; k++; } while (j<=right){ array1[k]=array[j]; j++; k++; } for (int s = left; s <= right; s++) { //将array1中的元素复杂到array中 array[s]=array1[s]; } }
4 算法分析
(1)空间复杂度:Merge()函数运行时,辅助单元为n个,则算法的空间复杂度为O(n)
(2)时间复杂度:任何情况下,时间复杂度均为O(nlogn)
(3)稳定性:稳定