为了方便起见,程序将分与治写在同一个函数中,并且部分代码不合理,比较消耗资源,但是胜在程序容易理解。
/**
* 归并排序是一种分治算法,思想在于分而治之,一下是测试50000个随机数时,排序效率:
* (其他两个排序代码请见以前的文章)
* 冒泡排序用时:5370
* 归并排序用时:19
* 选择排序用时:1352
*/
public static int[] mergeSort(int arr[], int left, int right) {
// 递归结束条件,因为是将合并与分治写在一个函数,而返回值类型为int[]
// 所以递归返回的为int[](ps:这样比较消耗内存资源与CPU资源)
if (left >= right) {
int t[] = new int[1];
t[0] = arr[left];
return t;
}
int mid = left + (right - left) / 2;
// 划分子问题(一般递归)
int le[] = mergeSort(arr, left, mid);
int ri[] = mergeSort(arr, mid + 1, right);
// 合并操作
int mer[] = new int[le.length + ri.length];//比较浪费空间
//但是笔者内存多,哈哈哈
int i, j, count = 0;
//将左右数组按照大小放入mer中
for (i = 0, j = 0; i < ri.length && j < le.length;) {
if (ri[i] < le[j]) {
mer[count] = ri[i];
i++;
count++;
} else {
mer[count] = le[j];
j++;
count++;
}
}
// 当左右数组大小不等时,需要将长的剩余部分复制到mer中
if (i >= ri.length && j < le.length) {
for (; j < le.length; j++) {
mer[count] = le[j];
count++;
}
} else {
for (; i < ri.length; i++) {
mer[count] = ri[i];
count++;
}
}
return mer;
}