1.归并排序思想(参考百度百科)
(1)归并排序主要采用了分治法(Divide and Conquer)的思想。是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。
(2)速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
2.归并排序详细分析(以递减为例)(参考百度百科)
归并排序算法分为两步,第一步:先将原来的数据表分成排好序的子表(定义函数Merge),然后调用 MergeSort 对子表进行归并,使之成为有序表。
例如:设需排序的数组 a={34,23,12,43 , 22 , 11 , 45 , 32,33 , 11}
(1)调用Merge函数,将数组a分为两部分left={34,23,12,43,22},right={11,45,32,33,11};
(2)对步骤(1)中的left和right分别调用Merge函数;
(3)重复步骤(2),直到字符串的长度为1时,返回字符串。例如,left部分一直划分到最后为:left=Merge({34})={34},right=Merge({23})={23};
(4)再调用MergeSort 对子表进行归并。
3.算法性能
(1)时间复杂度:O(nlogn) 这是该算法中最好、最坏和平均的时间性能。
(2)空间复杂度:O(n)
(3)稳定性:稳定的.
(4)归并排序比较占用内存,但却是一种效率高且稳定的算法。
4.算法实现(java)
public class Solution{
public static void main(String[]args){
int[] a = {34,23,12,43,22,11,45,32,33,11};
a=Merge(a,0,a.length-1); //若不加上“a=”,直接调用Merge函数,会少排序一次~为什么呢?(有时间时查一下)
for(int i:a){
System.out.print(i+" ");
}
System.out.println();
}
public static int[] Merge(int[] a,int left,int right){
int alen = right-left;
if(left==right) {
int[] temp={a[left]};
return temp;
}
int mid = left+alen/2;
int[] leftA = Merge(a,left,mid); //备注:此处是否可以不新建数组,只是标记下标呢(有时间时再想想~)
int[] rightA = Merge(a,mid+1,right);
return MergeSort(leftA,rightA);
}
public static int[] MergeSort(int[] left,int[] right){
int alen = left.length;
int blen = right.length;
int[] newArray = new int[alen+blen];
while(i<alen&&j<blen){
if(left[i]>=right[j]){
newArray[k++] = left[i++];
}else{
newArray[k++] = right[j++];
}
}
while(i<alen){
newArray[k++] = left[i++];
while(j<blen){
newArray[k++] = right[j++];
}
return newArray;
}
}