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

【排序算法】归并排序(java实现)

2016-04-28 15:58 537 查看

1.基本思想:

归并排序指的是将两个已经排序的序列合并成一个序列的操作。主要分为两种,分别是自顶向下的排序方式和自底向上的排序方式。

对于自顶向下的排序算法:

采用分治法进行自顶向下的程序设计方式,分治法的核心思想就是分解、求解、合并

(1)将长度为N的无序序列平均分割成两个子序列

(2)对这两个子序列分别进行归并排序

(3)将排序好的两个子序列进行归并排序



对于自底向上的排序算法:

第1 趟归并排序,将这含有N个元素的无序序列看成N个长度为1 的有序序列,两两归并。如果是偶数个子序列,则得到长度为N/2 的子序列;如果是奇数个,则最后一个轮空,得到(n-1)/2 +1 个子序列

第2趟归并排序,第1趟归并所得到的有序的子序列两两归并。

如此反复,直至得到一个长度为n的有序序列为止。



2.算法分析:

时间复杂度:O(nlog2n)

空间复杂度 : O(n)

稳定性:稳定

3.算法实现:

3.1自顶向下:

//归并排序	自顶向下
public static void Merge(int[] array,int start ,int mid,int end){
int i=start,j=mid+1,l=0;
int[] total = new int[end - start+1];

while(i <= mid && j <= end){
if(array[i] <array[j]){
total[l++] = array[i++];
}else{
total[l++] = array[j++];
}
}
while(i <= mid)
total[l++] =array[i++] ;
while(j <= end)
total[l++] =array[j++] ;
for(i = 0; i < l; i++){
array[start + i] = total[i];
}
}
public static void MergeSort(int[] array,int start,int end){
if(start < end){
int mid =(start + end)/2;
//int mid = (start & end) + (start ^ end)>>1;
MergeSort(array,start,mid);
MergeSort(array,mid+1,end);
Merge(array,start,mid,end);
}
}


3.2自底向上:

//自底向上
public static void MergeGroup(int[] array,int len, int sub_len){
int new_sublen = sub_len*2;
int i;
for(i = 0; i + new_sublen - 1 < len; i += new_sublen){
Merge(array,i,i+sub_len-1,i+new_sublen-1);
}
//进行最后一次归并
if (i == 0) Merge(array,i,i+sub_len-1,len-1);
}

public static void MergeSort2(int[] array){
int len = array.length ;
if (len <= 0) return;
for (int n =1; n < len; n*=2){
MergeGroup(array,len,n);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: