**
归并排序C++(小白打卡)
**
简单说就是将一串数分割为多个小部分,然后按顺序合并的过程。其他大佬的图解讲的已经很清楚了hh,我直接上代码。
思路
- 以整个数组为对象执行mergeSort
- mergeSort如下所示
a.将含有n个元素的局部数组分割成两个数组,每个数组里包含n/2个元素
b.将两个数组分别进行排序
c.将两个排序好的数组整合到一个数组中
代码如下:
#include<iostream>
using namespace std;
int n;
int cnt; //比较运算的次数
#define max 500000
#define MAXNUMBER 2000000000
int l[max/2+2],r[max/2+2];
//整合数组
void merge(int a[],int left,int mid,int right) //left指开头元素,right指末尾元素+1的元素
{
int k,i,j;
k=left;
for(i=0;i<mid-left;i++) l[i]=a[left+i];
for(j=0;j<right-mid;j++) r[j]=a[mid+j];
l[mid-left]=r[right-mid]=MAXNUMBER; //<——这个很重要啊家人们, 我们在 l 与 r 末尾分别安插一个很大很大的元素标记,
i=j=0; // 因为我们在比较 l 与 r 的元素时,势必会遇到元素与标记相比较的情况,只
while(k!=right) // 要我们标记的足够大,就可以将比较次数限制在 right-left 之间
{
cnt++;
a[k++]= l[i]<=r[j] ? l[i++]:r[j++]; //把 r 和 l 数组按照升序排列复制到数组 a 中
}
}
//分割数组
void mergeSort(int a[],int left,int right)
{
int mid;
if(left<right-1)
{
mid=(left+right)/2;
mergeSort(a,left,mid); //左右都要比一比
mergeSort(a,mid,right);
merge(a,left,mid,right);
}
}
int main()
{
int a[max],left,right;
cin>>n;
cnt=0;
for(int i=0;i<n;i++) cin>>a[i];
mergeSort(a,0,n);
cout<<a[0];
for(int i=1;i<n;i++) cout<<" "<<a[i];
cout<<endl<<cnt<<endl;
return 0;
}