您的位置:首页 > 编程语言 > Java开发

排序算法--归并排序(JAVA)

2015-04-24 15:33 239 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序算法