归并排序
基本原理:归并排序就是将若干个已经排好序的部分合并成一个有序部分。顺序比较两者相应的元素,小者移入到另一个表中,反复如此即不断地进行递归分解、合并。
时间效率:
O(nlog2n)
空间效率:
O(n)
算法稳定性:稳定
public class Main{
public static void main(String[] args) {
int num[] = {1,5,78,4,35,35,358,35,55,63};
mergeSort(num);
System.out.println(java.util.Arrays.toString(num));
}
//归并排序
public static void mergeSort(int []num){
sort(num,0,num.length-1);
public static void sort(int[]num,int left,int right){
if(left<right){
int center = (left+right)/2;
sort(num,left,center);
sort(num,center+1,right);
merge(num,left,center,right);
}
}
public static void merge(int[]num,int left,int center,int right){
int tempArr[] = new int[right-left+1];
int i = left;//左指针
int j = center+1;//右指针
int k = 0;
//将较小的数移入数组
while(i<=center && j<=right){
if(num[i]<num[j]){
tempArr[k++] = num[i++];
}else{
tempArr[k++] = num[j++];
}
}
//将左边剩余的数移入数组中
while(i<=center){
tempArr[k++] = num[i++];
}
//将右边剩余的数移入数组
while(j<=right){
tempArr[k++] = num[j++];
}
//覆盖原数组
for(int kk = 0;kk<tempArr.length;kk++){
num[kk+left] = tempArr[kk];
}
}
}