アルゴリズムの基礎 - マージソート

A.前提知識(分割統治アイデア)

  オリジナルのいくつかの小さな規模に問題が、サブ問題の元の問題と同様に、これらのサブ問題を解決RECURSIVE、次いで脱合併元の問題の解決策を確立するこれらのサブ問題。

  パーティションのモデルは、各再帰で3つのステップがあります。

  1.いくつかのサブ問題に元の問題を分解し、これらのサブ問題は元の問題の小さい例です。

  2.再帰的に各サブ問題を解決する、これらのサブ課題を解決するために。場合は、サブ問題の大きさが十分に小さく、直接の解決策。

  3.元の問題に問題のこれらのサブ液溶液の合併。

II。マージソートアルゴリズム

  アイデア:パーティションのアイデア。

  主なステップを組み合わせたマージマージ含むと分割のステップ。

  1.解決プロセス

   例えば、我々は、配列のソートします

値int [] = { 32476 }。

   アレイに最初上分割

INT B [] = { 32 }。
INT C [] = { 476 }。

    その後に分解

  

  スプリット(わずか数)の時間に分割することはできません。これは、マージすることができます。

  2.合併のプロセス

   少年は、最初のソート4,7として、ほとんどの問題解決です。

III。ソース

#include<iostream>
using namespace std;
//合并 
void Merge(int *a,int p,int q,int r){
//参数说明 a排序数组 p,q,r为下标且p<q<r 
    int n1 = q-p+1;
    int n2 = r-q;
    int *L = new int[n1+1];
    int *R = new int[n2+1];
    int i,j,k;
    //获取此时的子数组 
    for(i=0;i<n1;i++){
        L[i] = a[p+i];
    }
    for(j=0;j<n2;j++){
        R[j] = a[q+j+1];
    }
    //将排好序的子数组合并到原数组 
    L[n1] = 1000000;
    R[n2] = 1000000;
    for(i=0,j=0,k=p;k<=r;k++){
        if(L[i]<=R[j]){
            a[k] = L[i];
            i++;
        }else{
            a[k] = R[j];
            j++;
        }
    }
    delete []L;
    delete []R;
}
//拆分 
void MergeSort(int *a,int p,int r){
    //参数 a为待排序数组,p为排序的下标,r为排序的上标,p<r
    if(p<r){
        int q = (p+r)/2;
        //将一个数组拆分成两个数组 
        MergeSort(a,p,q);
        MergeSort(a,q+1,r);
        //合并操作 
        Merge(a,p,q,r);
    }
}
int main()
{
//    p q r为数组下标 
   int a[10] = {12,10,8,5,6,76,32,45,43,89};
   MergeSort(a,0,3); 
//传参表示从a[0]到a[3]排序 
   for(int i =0;i<10;i++)
   {
       cout<<a[i]<<" "; 
   }
    
    
    return 0;
}

四.归并排序是时间复杂度稳定的排序算法,最差和最优都是O(nlogn)

おすすめ

転載: www.cnblogs.com/zhang1568234/p/12114308.html