基于C++的归并排序算法

来源:互联网 发布:免费的收银软件 编辑:程序博客网 时间:2024/06/05 17:22

基于C++的归并排序算法

归并排序(Merge Sort)是利用“归并”技术来进行排序。

  1. 算法基本思路

设有两个子文件(相当于输入堆,这里我是随机生成的)放在同一向量中相邻的位置上:L[low..mid],R[mid+1..high],然后通过不断分治(如图所示,图临时画的,不要嫌丑),最好再将其合并完成到Array数组中.

2、合并过程

       设置i,j两个变量,分别指向当前位置,并依次比较L[i]R[j],取数值小的放左边并做i++,使i位置后移一个,数值大的放到右边并做j++,使j的位置前移一个。

3、动态申请

       动态申请*L*R,并都申请为len1len2的大小=INT_MAX;

4、程序代码

#include"cstdlib"

#include"iostream"

#include"time.h"

#include"limits.h"

using namespace std;



//合并排序

void Merge(int *_Array,int p,int q,int r){

       //p0 r n-1个数   q 第(r+p/2个数

       intlen1 = q-p+1;

       intlen2 = r-q;

       int*L = new int[len1+1]; //用动态数组存储左边的数

       int*R = new int[len2+1]; //用动态数组存储右边的数

      

       for(inti=0;i<len1;i++){

              //Array数组左边的数放入L数组

              L[i]= _Array[p+i];

       }

      

       for(intj=0;j<len2;j++){

              //Array数组右边的数放入R数组

              R[j]= _Array[q+1+j];

       }

       L[len1]=R[len2]=INT_MAX; //定义无穷大

      

       inti=0;

       intj=0;

       for(intk=p;k<=r;k++){

              if(L[i]<R[j]){

                     //小的放左边,大的放右边

                     _Array[k]=L[i];

                     i++;

              }

              else{

                     _Array[k]=R[j];

                     j++;

              }

       }

}

 

 

//归并排序

 

void MergeSort(int _Array[],int p,int r){

       if(p<r){

              //p0;rn-1个数;数组至少需要两个数据

              intq;

              q=(r+p)/2;//拆分两组

              MergeSort(_Array,p,q);//拆分第0个到第(r+p/2个,即拆分左半部分

              MergeSort(_Array,q+1,r);//拆分第(r+p/2个到第r个,即拆分右半部分

              Merge(_Array,p,q,r);//调用合并函数,从第0个到第n-1个排好

       }

}

 

int main(){

       intn;

       cout<<"输入产生数组元素的个数:";

       cin>>n;

       cout<<endl;

       int*Array = new int[n]; //定义动态数组

       cout<<"产生的随机数组为:";

       for(inti=0;i<n;i++){

              Array[i]= (rand()%(10000-0+1))+0; //产生0~100的整数

              cout<<Array[i]<<"";

       }

       cout<<endl;

       MergeSort(Array,0,n-1);

       cout<<endl;

       cout<<"AfterMergeSort";

       for(inti=0;i<n;i++){

              cout<<Array[i]<<"";

       }

       return0;

}

原创粉丝点击