二路归并排序

1 基本思想

“归并”的含义是将两个或两个以上的有序表合并称一个新的有序表。假定待排序表含有n个记录,则可将其视为n个有序的子表,每个子表的长度为1,然后两两归并,得到n/2个长度为2或1的有序表;继续两两归并……如此重复,直到合并成一个长度为n的有序表为止,这种排序方法称为2路归并

2 实例

假设初始序列为50,26,38,30,70,30,则归并排序的过程为

3 算法实现

 

public static void MergeSort(int[] array,int left,int right){
    if(left<right){
        int mid=(left+right)/2;
        MergeSort(array,left,mid);           //对左侧子序列进行递归排序
        MergeSort(array,mid+1,right);        //对右侧子序列进行递归排序
        Merge(array,left,mid,right); 
    }
}
private static void Merge(int[] array,int left,int mid,int right) {
    int[] array1 = new int[array.length];
    int i = left;
    int j = mid + 1;
    int k=left;
    while(i<=mid&&j<=right){
        if(array[i]<=array[j]){
            array1[k]=array[i];
            i++;
        }
        else{
            array1[k]=array[j];
            j++;
        }
        k++;
    }
    while (i<=mid){
        array1[k]=array[i];
        i++;
        k++;
    }
    while (j<=right){
        array1[k]=array[j];
        j++;
        k++;
    }
    for (int s = left; s <= right; s++) {   //将array1中的元素复杂到array中
        array[s]=array1[s];
    }
}

 4 算法分析

(1)空间复杂度:Merge()函数运行时,辅助单元为n个,则算法的空间复杂度为O(n)

(2)时间复杂度:任何情况下,时间复杂度均为O(nlogn)

(3)稳定性:稳定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值