归并排序是用分治思想,分治模式在每一层递归上有三个步骤:
- 分解(Divide):将n个元素分成个含n/2个元素的子序列。
- 解决(Conquer):用合并排序法对两个子序列递归的排序。
- 合并(Combine):合并两个已排序的子序列已得到排序结果
编程的时候采用了自顶向下方式:
public class MyClass {
public static void main(String[] args){
int[] arr=new int[]{6,35,13,4};
mergeSortAlgorithm(arr);
for(int j:arr){
System.out.print(j+",");
}
}
public static void mergeSortAlgorithm(int[] arr){
int left=0;
int right=arr.length-1;
//int mid=left+(right-1)/2;
int temp[]=new int[arr.length];
divideArray(arr,left,right,temp);//先分治
}
private static void divideArray(int[] arr, int left, int right, int[] temp) {
if(left<right){
int mid=left+((right-left)/2);
divideArray(arr,left,mid,temp);
divideArray(arr,mid+1,right,temp);
mergeSortArray(arr,left,mid,right,temp);
}
}
/**
* 合并2个有序的子数组到临时数组,并且最后把临时数组的数据 赋值到arr数组
* @param arr
* @param left
* @param mid
* @param right
* @param temp
*/
private static void mergeSortArray(int[] arr, int left, int mid, int right, int[] temp) {
int i=left;
int j=mid+1;
int idx=left;//temp下标
while(i<=mid&&right>=j){
if(arr[i]<=arr[j]){
temp[idx]=arr[i];
i++;
}else{
temp[idx]=arr[j];
j++;
}
idx++;
}
//填充temp数组mid左边剩余的下标位置数据
while(i<=mid){
temp[idx]=arr[i];
idx++;
i++;
}
//填充temp数组mid右边剩余的下标位置数据
while(j<=right){
temp[idx]=arr[j];
idx++;
j++;
}
//将temp所有数据赋值到arr中
idx=left;
while(left<=right){
arr[left]=temp[idx];
idx++;
left++;
}
}
}
归并排序算法时间复杂度:最好,最坏,平均时间复杂度均为O(nlogn)。