归并排序是一种比较容易被理解但是比较难被实现的排序,与其他排序不同,它需要去虚拟出一个暂时的数组,这种数组占据一定的空间,用空间来替换时间,在现在硬件较为快速,所以这种替换比较划算,归并排序也顺理成章地成为了O(nlogn)算法,它的思想在于一分为二,有两个标记位我们称为左标记位和右标记位,一分为二的数组,它们是有序的,以如下数组为例
1,3,7,9,2,3,8,10
我们看到这个例子可以分为两个部分
1,3,7,9
2,3,8,10
初始化数组
0 0 0 0 0 0 0 0
左标记位在1上,右标记位在2上
1,3,7,9,2,3,8,10
1和2比较,1<2 1放入初始化数组
1 0 0 0 0 0 0 0
左标记位向右,右标记位保持不变
3和2比较,3>2 2 放入初始化数组
1 2 0 0 0 0 0 0
右标记位向右,左标记位保持不变
那么在哪截止呢?当然是当左标记位>右标记位,然后我们对右标记位剩下的数组进行赋值处理
代码如下
//1 2 3 4 1 4 5 7
//
int[] arr = {1, 2, 3, 4, 1, 4, 5, 7};
int[] sortArr = new int[arr.length];
int middle = arr.length / 2;
int left = 0;
int right = middle;
for (int i = left; i < right; i++) {
if (arr[left] <= arr[right]) {
sortArr[i] = arr[left];
left++;
} else {
sortArr[i] = arr[right];
right++;
}
}
for (int i = right; i < sortArr.length; i++) {
sortArr[i] = arr[i];
}