算法思想
将两个或两个以上的有序表组合成一个新的有序表,假定待排序列表含有n个记录,则可将其视为n个有序的子表,每个子表的长度为1,然后两两归并,得到新的子表在两两归并……如此重复,知道得到一个长度为n的有序表为止。
//归并函数public static void merge(int array[], int low, int mid, int high){//拷贝数组int [] newArray = Arrays.copyOf(array,array.length);int i = low, j = mid+1, k = low;while ((i <= mid) && (j <= high)){if (newArray[i] < newArray[j])array[k++] = newArray[i++];elsearray[k++] = newArray[j++];}while (i <= mid)array[k++] = newArray[i++];while (j <= high)array[k++] = newArray[j++];}public static void mergeSort(int array[], int low, int high){if (low < high){int mid = (low + high) / 2;mergeSort(array,low,mid);mergeSort(array,mid+1,high);merge(array,low,mid,high);}}
复杂度分析
时间复杂度:每趟归并的时间复杂度为O(n),共需进行┎log2n┒,所以算法的时间复杂度为O(nlog2n)
空间复杂度:归并操作中,需要n个辅助空间,空间复杂度为O(n)
