归并排序

算法原理

归并排序(Merge Sort)算法的原理如下:
通过反复采用分治策略,将一个无序向量分为两个尽量等长的无序向量,不断分割至有序向量(当向量中仅有一个元素时,该向量必定为有序向量),再调用二路归并(2-way merge)算法,即不断归并两个有序向量为一个有序向量,直到得到唯一的有序向量。

算法分析

归并排序可大体分为两步,第一步:生成有序向量,第二步:合并有序向量。假设有n个元素,将其不断拆分需要log n次操作,而每次操作中的合并步骤范围为[2,n],则归并排序时间复杂度: O(n log n)。

Code:

#include <iostream>
using namespace std;

int input[1000000];
void swap(int & a,int & b)
{
    int tmp = a;
    a = b;
    b = tmp;
    return ;
}
void Merge(int begin, int mid, int end, int *data)
{
    int * tmp = new int[end-begin+1];
    int l = begin, r = mid+1;
    int index = 0;
    while(l<=mid && r<=end)
    {
        if(data[l]<=data[r])
            tmp[index++] = data[l++];
        else
            tmp[index++] = data[r++];
    }
    while(l<=mid) tmp[index++] = data[l++];
    while(r<=end) tmp[index++] = data[r++];
    index = 0;
    for (int n = begin;n<=end;n++,index++) data[n] = tmp[index];
    delete [] tmp;
}
void Merge_Sort(int begin, int end, int * data)
{
    if (end-begin<2) return ;
    int mid = (begin+end)/2;
    Merge_Sort(begin,mid,data);
    Merge_Sort(mid+1,end,data);
    Merge(begin,mid,end,data);
}

int main()
{
    int N;
    cin>>N;
    for (int n = 0; n < N; n++) cin>>input[n];
    Merge_Sort(0,N-1,input);
    return 0;
}
发布了135 篇原创文章 · 获赞 98 · 访问量 9万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览