2.3.1-分治法-归并排序

来源:互联网 发布:淘宝屏蔽粉丝数 编辑:程序博客网 时间:2024/06/05 15:16

过程如图所示

这里写图片描述

#include <iostream>  #include <cstring>#include <cstdio>#include <algorithm>#include <string>#include <string.h>#include <cmath>#include <sstream>#include <set>#include <map>#include <functional>#include <queue>#include <vector>using namespace std;const int maxn = 1e9;int A[20] = { 0,0,0,0,0,0,0,0,0,5,2,4,7,1,3,2,6};int L[20], R[20];void MergeSort(int p,int q,int r){    int i, j, k;    int n1 = q - p+1;    int n2 = r - q;    for (i = 1; i <= n1; i++)        L[i] = A[p + i - 1];    for (i = 1; i <= n2; i++)        R[i] = A[q + i];    L[n1 + 1] = maxn;    R[n2 + 1] = maxn;    i = j = 1;    for (k = p; k <= r; k++)    {        if (L[i] <= R[j])        {            A[k] = L[i];            i++;        }        else        {            A[k] = R[j];            j++;        }    }}void Merge(int p, int r){    if (p < r)    {        int q = (p + r) / 2;        Merge(p, q);        //排序左半部分        Merge(q+1, r);      //排序右半部分        MergeSort(p, q, r);    }}int main(){    Merge(9,16);    for (int i = 9; i <= 16; i++)        cout << A[i] << " ";    system("pause");}
练习2.3-2 另外一种不采用哨兵的MergeSort #include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <string>#include <string.h>#include <cmath>#include <sstream>#include <set>#include <map>#include <functional>#include <queue>#include <vector>using namespace std;const int maxn = 1e9;int A[11] = {9,8,7,6,5,4,3,2,1,0 ,-1};int L[20], R[20];void MergeSort(int p,int q,int r){    int i,j,k,n1,n2;    n1=q-p+1;    n2=r-q; //   cout<<n1<<" "<<n2<<endl;    for(i=0;i<n1;i++)        L[i]=A[p+i];    for(i=0;i<n2;i++)        R[i]=A[q+i+1];    for(i=0,j=0,k=p;k<=r;k++)    {        if(i==n1)            A[k]=R[j++];        else if(j==n2)            A[k]=L[i++];        else if(L[i]<=R[j])            A[k]=L[i++];        else            A[k]=R[j++];    }}void Merge(int p,int r){    if(p<r)    {        //cout<<p<<" "<<" "<<r<<endl;        int mid=(p+r)/2;        Merge(p,mid);        Merge(mid+1,r);        MergeSort(p,mid,r);    }}int main(){    Merge(0,9);    for(int i=0;i<10;i++)        cout<<A[i]<<" ";    cout<<endl;}