排序之归并排序

本文介绍了一种基于分治法的有效排序算法——归并排序。详细解释了归并排序的原理及其实现过程,并分析了其时间复杂度为O(N*logN),空间复杂度为O(N),是一种稳定的排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序

  • 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
  • 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

在这里插入图片描述

代码实现
void mergeSortInternal(int a[],int left,int right){
     if(left>=right){
        return;
     }
     int mid=(right-left)/2+left; //取中点
     //将原来序列分为两段 
     mergeSortInternal(a,left,mid);
     mergeSortInternal(a,mid,right);
     //合并刚才分开的两段,得到原来序列的有序序列
     merge(a,left,mid,right,right-left+1);
}

void merge(int a[],int left,int mid,int right,int n){
	int *temp = new int[n];

	int i = left;
	int j = mid + 1;
	int k = 0;
	//合并数组,用插入排序,如果左边大就插入左边的数,右边的计数器等待,与下一个左边的数比较;右边大就插入右边的数,左边的计数器等待,与下一个右边的数比较(这里指的插入是插入到新数组t[])
	while (i <= mid&&j <= right){
		if (a[i] <= a[j]){
			temp[k++] = a[i++];
		}
		else{
			temp[k++] = a[j++];
		}
	}
	//上面的步骤在执行完后,左或右边都有可能剩余若干个元素,而另一边的元素肯定已全部复制到新数组,这时需要特殊对待剩下的元素
	while (i <= mid){
		temp[k++] = a[i++];
	}
	while (j <= right){
		temp[k++] = a[j++];
	}
	 //把temp[]的元素复制回a[]中left到right段
	for (i = left, k = 0; i <= right; k++,i++){
		a[i] = temp[k];
	}
	//释放内存
	delete[] temp;
}
归并排序的特性总结
  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值