A.前提知識(分割統治アイデア)
オリジナルのいくつかの小さな規模に問題が、サブ問題の元の問題と同様に、これらのサブ問題を解決RECURSIVE、次いで脱合併元の問題の解決策を確立するこれらのサブ問題。
パーティションのモデルは、各再帰で3つのステップがあります。
1.いくつかのサブ問題に元の問題を分解し、これらのサブ問題は元の問題の小さい例です。
2.再帰的に各サブ問題を解決する、これらのサブ課題を解決するために。場合は、サブ問題の大きさが十分に小さく、直接の解決策。
3.元の問題に問題のこれらのサブ液溶液の合併。
II。マージソートアルゴリズム
アイデア:パーティションのアイデア。
主なステップを組み合わせたマージマージ含むと分割のステップ。
1.解決プロセス
例えば、我々は、配列のソートします
値int [] = { 3、2、4、7、6 }。
アレイに最初上分割
INT B [] = { 3、2 }。 INT C [] = { 4、7、6 }。
その後に分解
スプリット(わずか数)の時間に分割することはできません。これは、マージすることができます。
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)