#include <iostream>
#include <stdlib.h>
using namespace std;
void Merge(int a[],int b[],int left,int i,int right)/*a和b都是递增的,将a[]中的left到i和i+1到right合并成一个新的排好序的向量装到b[]里面去*/
{
int w=left,j=left,k=i+1; //a和b维度一样,w是b的指针,从left开始,j是前半段的指针,k是后半段的指针
while(j<=i&&k<=right) //与数据结构链表的Merge类似,两个指针同时++
{
if(a[j]<a[k]) //要是前半部分的小,j++,k不动
b[w++]=a[j++];
else
b[w++]=a[k++]; //要是后半部分的小,k++,j不动
}
if(k>right) //循环结束后,一定会有的指针超过了原来的范围,要么是j>i+,要么k>right
{
for(int m=j;m<=i;m++) //说明前半段还有剩的,b必须把这部分的给加进去,不过这次不用比较了,
b[w++]=a[m]; //因为已经是递增的了,直接一个for循环搞定
}
else //同理
{
for(int m=k;m<=right;m++)
b[w++]=a[m];
}
}
void copy(int a[],int b[],int left,int right)/*把b中从left到right的所有元素统统复制到a中*/
{
for(int i=left;i<=right;i++)
{
a[i]=b[i];
}
}
void MergeSort(int a[],int left,int right)/*递归方程,归并排序的核心思想就在这里*/
{
int *b=(int *)malloc((right-left+1)*sizeof(int)); //开辟一个b数组,便于后面把分好两类的数组合并然后放到b里面去,这样不会浪费内存哟!
if(left<right) //前提是必须要满足left<right的
{
int i=(left+right)/2; //二分的思想
MergeSort(a,left,i); //对左半部分进行递归调用
MergeSort(a,i+1,right); //对右半部分进行递归调用
Merge(a,b,left,i,right); //此时左右两边都已经排好序了,在把它们俩合并装到b里边儿
copy(a,b,left,right); //装到b里面之后,当然还要装回a啊,因为这个函数要改变的是a,b只是一个中间变量,类似于交换时的temp
}
}
int main()
{
int n,a[20];
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
MergeSort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
归并排序
最新推荐文章于 2021-05-18 19:45:06 发布