算法思想

将两个或两个以上的有序表组合成一个新的有序表,假定待排序列表含有n个记录,则可将其视为n个有序的子表,每个子表的长度为1,然后两两归并,得到新的子表在两两归并……如此重复,知道得到一个长度为n的有序表为止。
归并排序 - 图1

  1. //归并函数
  2. public static void merge(int array[], int low, int mid, int high){
  3. //拷贝数组
  4. int [] newArray = Arrays.copyOf(array,array.length);
  5. int i = low, j = mid+1, k = low;
  6. while ((i <= mid) && (j <= high)){
  7. if (newArray[i] < newArray[j])
  8. array[k++] = newArray[i++];
  9. else
  10. array[k++] = newArray[j++];
  11. }
  12. while (i <= mid)
  13. array[k++] = newArray[i++];
  14. while (j <= high)
  15. array[k++] = newArray[j++];
  16. }
  17. public static void mergeSort(int array[], int low, int high){
  18. if (low < high){
  19. int mid = (low + high) / 2;
  20. mergeSort(array,low,mid);
  21. mergeSort(array,mid+1,high);
  22. merge(array,low,mid,high);
  23. }
  24. }

复杂度分析

时间复杂度:每趟归并的时间复杂度为O(n),共需进行┎log2n┒,所以算法的时间复杂度为O(nlog2n)
空间复杂度:归并操作中,需要n个辅助空间,空间复杂度为O(n)