归并排序
排序思想
将两个有序数组进行归并排序–>将数组分成两部分分别排序(递归)。
核心代码
private static void mergeSort(int[] arr, int left, int right) {
//结束递归条件
if (left >= right) {
return;
}
//将数组分成两部分
int mid = left + (right - left) / 2;
//对数组左边进行排序
mergeSort(arr, left, mid);
//对数组右边进行排序
mergeSort(arr, mid + 1, right);
//将两个数组进行归并
merge(arr, left, mid + 1, right);
}
private static void merge(int[] arr, int left, int right, int rightBound) {
int mid = right - 1;
//创建新数组 用于存放归并后端数组
int[] temp = new int[rightBound - left + 1];
//数组的左部分的指针
int leftPtr = left;
//数组的右部分的指针
int rightPtr = right;
//新数组的指针
int index = 0;
//当数组的两部分都没有走完时,进行循环遍历
while (leftPtr <= mid && rightPtr <= rightBound) {
//等号 保证数组的稳定性
if(arr[leftPtr]<=arr[rightPtr]){
temp[index++] = arr[leftPtr++];
}else{
temp[index++] = arr[rightPtr++];
}
}
//当数组的左部分没有走完时 遍历
while(leftPtr<=mid){
temp[index++] = arr[leftPtr++];
}
//当数组的右部分还没有走完时 遍历
while(rightPtr<=rightBound){
temp[index++] = arr[rightPtr++];
}
//将temp数组中排好序的值 覆盖原数组中的值
for (int i = 0; i < temp.length; i++) {
arr[left+i]=temp[i];
}
}
特点
平均时间复杂度O(nlogn),最好时间复杂度O(nlogn),最坏时间复杂度O(nlogn),空间复杂度O(n),稳定。对于某种语言的内置对象排序算法一般都是归并排序及其改良版。