补充黄体酮的食物:用C++实现合并排序

来源:百度文库 编辑:九乡新闻网 时间:2024/05/07 19:52:49

用C++实现合并排序

做IT就要做精英,至少4000/月吧?
JAVAV工程师权威认证
[上海央邦]学一送一,超值! 【安博亚威】CCIE考试通过率第一!
定向委培RHCA,通过考试年薪10W
Windows高级工程师的培训地 中国IT实验室整理 佚名 2009-9-3 保存本文 推荐给好友 收藏本页 欢迎进入C/C++编程社区论坛,与200万技术人员互动交流 >>进入

    合并排序的思想:当只有一个元素时终止排序,超过一个元素的话,将所有元素分成大致相同的两个集合,分别对两个集合进行排序,最后将排好序的子集合合并为所要求的排好序的集合。

    在最坏情况下,时间复杂度为O(nlogn),它是一个渐进的最优算法。

    #include
    #include
    //这个函数将b[0]至b[right-left+1]拷贝到a[left]至a[right]
    template
    void Copy(T a[],T b[],int left,int right)
    {
    int size=right-left+1;
    for(int i=0;i    {
    a[left++]=b[i];
    }
    }
    //这个函数合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b
    template
    void Merge(T a[],T b[],int left,int i,int right)
    {
    int a1cout=left,//指向第一个数组开头
    a1end=i,//指向第一个数组结尾
    a2cout=i+1,//指向第二个数组开头
    a2end=right,//指向第二个数组结尾
    bcout=0;//指向b中的元素
    for(int j=0;j    {
    if(a1cout>a1end){b[bcout++]=a[a2cout++];continue;}//如果第一个数组结束,拷贝第二个数组的元素到b
    if(a2cout>a2end){b[bcout++]=a[a1cout++];continue;}//如果第二个数组结束,拷贝第一个数组的元素到b
    if(a[a1cout]    else
    {b[bcout++]=a[a2cout++];continue;}
    }
    }
    //对数组a[left:right]进行合并排序
    template
    void MergeSort(T a[],int left,int right)
    {
    T *b=new int[right-left+1];
    if(left    int i=(left+right)/2;//取中点
    MergeSort(a,left,i);//左半边进行合并排序
    MergeSort(a,i+1,right);//右半边进行合并排序
    Merge(a,b,left,i,right);//左右合并到b中
    Copy(a,b,left,right);//从b拷贝回来
    }
    }
    //from http://hi.baidu.com/zhangamxqun
    int main()
    {
    int n;
    cout<<"how many numbers to sort:";
    cin>>n;
    int *a=new int[n];
    cout<<"input "<    for(int i=0;i    {cin>>a[i];}
    MergeSort( a, 0, n-1);
    for(int j=0;j    {
    cout<    }
    return 1;
    }