zoukankan      html  css  js  c++  java
  • 高效率的排序算法2--归并排序

    速度仅次于快速排序,而且排序稳定的就是你了--归并排序,不过实现起来比快排要略复杂。

    归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。

    为了让二组有序,可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

    为了方便当做模板套用,我把if和while循环后面都加了大括号

    代码如下:

    //本次编写的为按从大到小的顺序 
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int a[1000],temp[1000];//大小自己根据题目要求来改 
    void mergearray(int a[],int temp[],int first,int mid,int last){
        int i=first, mm=mid;//将a数组分成两部分,i到mm位前半部分,j到nn为后半部分 
        int j=mid+1, nn=last;
        int k=0;//k为中间数组的下标 
        while(i<=mm&&j<=nn){
            if(a[i]>=a[j]){
                temp[k++]=a[i++];
            }
            else{
                temp[k++]=a[j++];
            }
        }
        while(i<=mm){
            temp[k++]=a[i++];
        }
        while(j<=nn){
            temp[k++]=a[j++];
        }
        //接下来别忘记了起始点是first 
        for(int i=0;i<k;i++)    a[first+i]=temp[i];//再把中间数组的值赋回原数组 
    }
    void mergesort(int a[],int first,int last,int temp[]){
        if(first<last)    {
        int mid=(first+last)/2;
        mergesort(a,first,mid,temp);//递归调用 
        mergesort(a,mid+1,last,temp);
        mergearray(a,temp,first,mid,last);
        }
    }
    int main(){
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        mergesort(a,0,n-1,temp); 
        for(int i=0;i<n;i++){
            cout<<a[i]<<" ";
        }
        cout<<endl;
    }
  • 相关阅读:
    vue封装一些常用组件loading、switch、progress
    个人推荐的两款vue导出EXCEL插件
    解决react项目中跨域和axios封装使用
    vue仿阿里云后台管理(附加阿里巴巴图标使用)
    简单的利用nginx部署前端项目
    Python3 SMTP发送邮件
    WINDOWS和UNIX换行符的理解
    Forward Proxy vs Reverse Proxy
    Authentication token is no longer valid
    SNMP Introduction
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/9366378.html
Copyright © 2011-2022 走看看