/*
* (二分)归并排序(稳定算法)
* 基本思想:将数组递归分成越来越小的数集,直到每个数集只有一个数
* 然后将数据递归排序,使其合并成与原来数据一样的有序序列
* 时间复杂度分析:递归分解数据,需要递归logN次,每次都需要对n个数据扫描一次,最好最坏平均都一样,所以O(nlogn)
* 空间复杂度分析:归并排序需要一个临时temp[]来储存归并的结果,所以 O(n)
*
* 基本实现:需要两个函数,一个用来递归划分数组,比较简单,依次二分即可
* 一个用来把划分好的数组递归排序并合并:两个数组从第一个元素开始比较,小的数据入,直到一个数组中数据为空,
* 然后把另一个数组中的剩余数据写入,最后用temp数组替代初始的数组
*/
public void merge(int[] a, int start, int mid, int end) {
int[] temp = new int[end - start + 1];
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (a[i] < a[j]) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= end) {
temp[k++] = a[j++];
}
for (int m = 0; m < temp.length; ++m) {
a[start + m] = temp[m];
}
}
/**
* @param a
* @param start 数组索引
* @param end 数组索引,<.length
*/
public void mergeSort(int a[], int start, int end) {
int mid = (end + start) / 2;
if (start < end) {
mergeSort(a, start, mid);
mergeSort(a, mid + 1, end);
merge(a, start, mid, end);
}
}
Ps:博文为博主的学习笔记,算法只是按照自己的理解简单分析,初学者建议看详细的图文讲解,如果有错误,欢迎交流指正