归并排序(Merge Sort)
-
基本思想
- 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。
- 首先考虑下如何将2个有序数列合并。这个非常简单,只要从比较2个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
- 归并排序思路:将数组分成2组A,B,如果这2组组内的数据都是有序的,那么就可以很方便的将这2组数据进行排序。
- 那么如何让这2组组内数据有序了?可以将A,B组各自再分成2组。依次类推,当分出来的小组只有1个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的2个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
-
过程
过程.png -
平均时间复杂度:O(NlogN)
- 归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。
Java代码
public void mergeSort(int array[], int first, int last) {
if (last > first) {
int middle = (last + first) / 2;
mergeSort(array, first, middle);
mergeSort(array, middle + 1, last);
mergeArray(array, first, middle, last);
}
}
public void mergeArray(int[] array, int first, int middle, int end) {
int i = first;
int[] temp = new int[end - first + 1];
int j = middle + 1;
int k = 0;
while (i <= middle && j <= end) {
if (array[i] < array[j]) {
temp[k++] = array[i++];
} else {
temp[k++] = array[j++];
}
}
while (i <= middle) {
temp[k++] = array[i++];
}
while (j <= end) {
temp[k++] = array[j++];
}
for (int n = 0; n < k; n++) {
array[first + n] = temp[n];
}
}