zoukankan      html  css  js  c++  java
  • 算法系列——归并排序

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

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

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <math.h>
    using namespace std;
    
    void print(int a[],int n){
        for(int i=0;i<n;i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }
    
    //将有二个有序数列a[first...mid]和a[mid+1...last]合并。  
    void mergearray(int a[], int first, int mid, int last, int temp[])  
    {  
        int i=first,m=mid;
        int j=mid+1,n=last;
        int k=0;
        while(i<=m && j<=n){
            if(a[i]<a[j]){
                temp[k++]=a[i];
                i++;
            }else{
                temp[k++]=a[j];
                j++;
            }
        }        
        while(i<=m){
                temp[k++]=a[i];
                i++;
        }
        while(j<=n){
            temp[k++]=a[j];
            j++;
        }
        // copy back to a
        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, first, mid, last, temp);
        }
    }  
      
    int main()
    {
            //测试
        int N = 10;
        int A[]={9,12,17,30,50,20,60,65,4,19};
        int B[]={9,12,17,30,50,4,20,60,65,70};
        int *temp=new int[N];
        
        mergesort(A,0,N-1,temp);
        print(temp,N);
        return 0;
    }

    归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是 一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在 O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。

  • 相关阅读:
    正则表达式(RegExp)
    文本处理工具(cut,sort,tr,grep等)
    权限和ACL练习题
    访问控制列表ACL
    权限和ACL访问控制-02-特殊权限
    数据库的高级操作
    数据表三范式&范式理论
    数据表之间的关系
    数据表的列类型
    修改表结构
  • 原文地址:https://www.cnblogs.com/oldtrafford/p/3839958.html
Copyright © 2011-2022 走看看