二分归并排序

二分归并排序Mergesort

1.问题

对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k

2.解析

归并排序是通过分治divide和归并merge的思想来实现的一种算法。
divide:将n个元素从中间n/2分开,分为[left,n/2]和[n/2+1,right]
merge:通过指针来比较当前两个元素的大小然后移动指针,然后根据排序要求逐个加入到另外的数组中,归并后再赋值给原数组。
在这里插入图片描述

3.设计

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;

void merge(int f[],int t[],int left,int right) {
    int mid = left+right>>1;
    int L = left,R = mid+1,st=left;
    while (L<=mid && R<=right) {
        if (f[L]<=f[R]) {
            t[st++] = f[L++];
        } else {
            t[st++] = f[R++];
        }
    }
    while (L<=mid) t[st++] = f[L++];
    while (R<=right) t[st++] = f[R++];
    for (int i=left;i<=right;i++) {
        f[i] = t[i];
    }
}

void sort(int f[],int t[],int left,int right) {
    int mid = left+right>>1;
    if (left>=right) return;
    sort(f,t,left,mid);
    sort(f,t,mid+1,right);
    merge(f,t,left,right);
}

void MergeSort(int f[],int length) {
    int t[N]; 
    sort(f,t,1,length);
}


int main() {
    int n,f[N];
    cin>>n;
    for (int i=1;i<=n;i++) {
        cin>>f[i];
    }
    MergeSort(f,n);
    for (int i=1;i<=n;i++) {
        cout<<f[i]<<" ";
    }
    cout<<endl;
}
/*
8
8 7 6 5 4 3 2 1
*/ 

4.分析

Merge算法比较次数:

  • 最坏比较次数为n-1,例如2,4,6,1,3,5比较次数为5次
  • 最佳比较次数为n/2,例如1,2,3,4,5,6比较次数为3次
  • 算法复杂度:
    1.W(n)=2W(n/2)+n-1,n=2^k
    2.W(1)=0
    综上,W(n)=nlogn+n-1

5.源码

二分归并排序

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值