归并排序(小白打卡)

**

归并排序C++(小白打卡)

**

简单说就是将一串数分割为多个小部分,然后按顺序合并的过程。其他大佬的图解讲的已经很清楚了hh,我直接上代码。

思路

  1. 以整个数组为对象执行mergeSort
  2. 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;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值