基于C++的归并排序算法
归并排序(Merge Sort)是利用“归并”技术来进行排序。
-
算法基本思路
设有两个子文件(相当于输入堆,这里我是随机生成的)放在同一向量中相邻的位置上:L[low..mid],R[mid+1..high],然后通过不断分治(如图所示,图临时画的,不要嫌丑),最好再将其合并完成到Array数组中.
2、合并过程
设置i,j两个变量,分别指向当前位置,并依次比较L[i]和R[j],取数值小的放左边并做i++,使i位置后移一个,数值大的放到右边并做j++,使j的位置前移一个。
3、动态申请
动态申请*L和*R,并都申请为len1,len2的大小=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){
//p第0个 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){
//p第0个;r 第n-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;
}