标签:sys 一个 size class 技术 lazy 方向 java sort
归并排序介绍
一种分而治之思想
归并排序步骤
从下往上的归并排序(自下而上的迭代)
从上往下的归并排序(自上而下的递归):它与"从下往上"在排序上是反方向的。它基本包括3步:
① 分解 -- 将当前区间一分为二,即求分裂点 mid = (low + high)/2;
② 求解 -- 递归地对两个子区间a[low...mid] 和 a[mid+1...high]进行归并排序。递归的终结条件是子区间长度为1。
③ 合并 -- 将已排序的两个子区间a[low...mid]和 a[mid+1...high]归并为一个有序的区间a[low...high]。
时间复杂度
平均时间复杂度 O(nlogn)
最坏时间复杂度 O(nlogn)
最好时间复杂度 O(nlogn)
该算法数据稳定
伪代码
function mergeSort
if left<right
mid=(left+right)/2
mergeSort:left-mid //左半部分递归分解
mergeSort:mid+1-right //右半部分递归分解
merge 合并
function merge
左右两边数据比较,小的放入temp数组,继续比较,直到把一边比完,剩余的全部放入temp
把temp赋值给arr数组
代码
package Sort;
import java.util.Arrays;
public class MergeSort2 {
public static void main(String[] args) {
int[] arr = {10,-1,-3,13,234,35,-9,3};
System.out.println(Arrays.toString(arr));
int[] temp= new int[arr.length];
mergeSort(arr,0,arr.length-1,temp);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr,int left,int right,int[] temp){
if(left<right){
int mid = (left+right)/2;
mergeSort(arr,left,mid,temp);
mergeSort(arr,mid+1,right,temp);
merge(arr,left,mid,right,temp);
}
}
public static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i=left;
int j=mid+1;
int t=0;
while(i<=mid&&j<=right){
if(arr[i]<arr[j]){
temp[t]=arr[i];
i++;
t++;
}else{
temp[t]=arr[j];
j++;
t++;
}
}
while(i<=mid){
temp[t]=arr[i];
i++;
t++;
}
while(j<=right){
temp[t]=arr[j];
j++;
t++;
}
t=0;
int tempLeft=left;
while(tempLeft<=right){
arr[tempLeft]=temp[t];
t++;
tempLeft++;
}
//赋值不是一次完成
//是0-1 2-3 0-3 4-5 6-7 4-7 0-7完成
}
}
参考:https://www.cnblogs.com/skywang12345/p/3602369.html
标签:sys 一个 size class 技术 lazy 方向 java sort
原文地址:https://www.cnblogs.com/youngst/p/14639145.html