C++归并算法

来源:互联网 发布:神武挖山水算法 编辑:程序博客网 时间:2024/05/02 01:45
如图是归并算法的示意图。打个比方,一个人对一副牌进行排序,然后他为了减轻工作,找来两位志愿者。每位志愿者拿牌的一半,然后分别对自己拿的那一叠牌进行排序。当把自己那一份从小到大排好之后。两位志愿者再把两叠牌合为一叠牌。规则如下:比较手中的牌,如果自己的牌小,就把牌放到桌面上。如果一方牌放完了,另一方就把牌全放上去。这就是归并。

#include <iostream>using namespace std;void divide(int A[],int mid,int start,int end){   //实现功能:把两个排好顺序的数组合并为一个。                                                      int size=end-start+1;                             int *temp=new int[size+15],count=0;        // 已经排好的两个数组分别是A[start,mid-1],A[mid,end]    int i=start,j=mid;    while(i<=mid-1 && j<=end){        if(A[i]<=A[j]){temp[count++]=A[i++];}  // 归并        else{temp[count++]=A[j++];}    }    while(i<=mid-1){                         // 把剩下的那个数组全部加到temp里        temp[count++]=A[i++];    }    while(j<=end){        temp[count++]=A[j++];    }    count=0;    for(int i=start;i<=end;i++){        A[i]=temp[count++];                     //把temp 复制到A里    }    delete []temp;                          // 删掉temp}int merge(int A[],int start,int end){    int temp;    if(end-start==1){                 //当只有两个数时,直接比较,不用再递归。        if(A[start]>A[end]){               temp=A[start];               A[start]=A[end];               A[end]=temp;        }    }    else if(end-start<=0){         return 0;    }    else{      int mid=(start+end)/2;      // 递归部分      merge(A,start,mid-1);      merge(A,mid,end);      divide(A,mid,start,end);    }  }int main(){    int A[15]={19,2,15,3,21,8,9};    merge(A,0,6);    for(int i=0;i<=6;i++){        cout<<A[i]<<" ";    }}





0 0