private void mergeSort(int[] arr,int start,int end){
if (start < end){
int mid = (start + end) / 2; // 划分子序列
mergeSort(arr,start,mid); // 对左侧子序列进行拆分
mergeSort(arr,mid+1,end);
merge(arr,start,mid,end); // 合并,排序
}
}
private void merge(int[] arr,int left,int mid,int right){
int[] temp = new int[arr.length];
int p1 = left; // 左部检测指针
int p2 = mid+1; // 右部检测指针
int k = left; // temp 存放指针
while (p1 <= mid && p2 <= right){
if (arr[p1] <= arr[p2])
temp[k++] = arr[p1++];
else
temp[k++] = arr[p2++];
}
// 左部序列未检测完,直接将后面所有元素加到合并序列
while (p1 <= mid)
temp[k++] = arr[p1++];
while (p2 <= right)
temp[k++] = arr[p2++];
for (int i = left; i <= right; i++){
arr[i] = temp[i];
}
}
时间复杂度 最优 最坏 平均
O(nlogn) O(nlogn) O(nlogn)
空间复杂度 O(n+logn)
归并排序是一种比较占用内存,但效率高且稳定。
归并排序需要两两比较,不存在跳跃,因此归并排序是一种稳定的排序算法。
归并排序
最新推荐文章于 2024-08-12 19:32:44 发布