栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【C++】归并排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++】归并排序

归并排序
前言

  归并排序主要利用了“归并”思想,对序列进行排序。归并排序的原理是:将序列两两分组,将序列归并为[n / 2]个组,组内单独排序。然后将这些组再两两归并,生成[n / 4]个组,组内再单独排序,以此类推,直到只剩下一个组为止。另外,归并排序的时间复杂度为:O(n logn)

下面来看看归并排序的两种简单实现。

递归实现

  反复将当前区间分为两半,对两个子区间分别递归进行归并排序,最后将两子区间合并为一有序序列即可。

#include

using namespace std;

//归并排序 递归实现

const int k = 100;

void merge(int A[], int L1, int R1, int L2, int R2){//将数组A的[L1, R1]与[L2, R2]区间合并为有序区间 L2 = R1+1 
 	int i = L1,j = L2;//i指向L1,j指向L2 
 	int temp[k] , index = 0;//temp临时存放合并后的数组,index为temp数组下标 
 	while(i <= R1 && j <=R2){ 
  		if(A[i] <= A[j]){
   		temp[index++] = A[i++]; //将A[i]加入数组 
  		}else{
   			temp[index++] = A[j++];//将A[j]加入数组 
  		}
 	}
 	//分别将[L1, R1]、[L2, R2]的剩余元素加入数组 
 	while(i <= R1) temp[index++] = A[i++]; 
 	while(j <= R2) temp[index++] = A[j++];
 	for(i = 0; i < index; i++){
  		A[L1 + i] = temp[i];//将合并后的数组赋值回A 
 	}
}
//将当前数组进行归并排序 
void mergeSort(int A[], int left, int right){
 	if(left < right){
  		int mid = (left + right) / 2;//取[left, right]中点 
  		mergeSort(A, left, mid);//递归 将[left, mid]归并排序 
  		mergeSort(A, mid + 1, right);//递归 将[mid+1, right]归并排序 
  		merge(A, left, mid, mid + 1, right);//将两区间合并 
 	}
}

int main(){
 	int A[7] = {66, 12, 33, 57, 64, 27, 18};
 	mergeSort(A, 0, 6);//归并排序 
 	for(int i = 0; i <=6; i++) cout< 
非递归实现 

  令step的初值为 2,然后将数组中每step个元素作为一组,将其内部进行排序,再令step * 2,重复上面的操作,直到step / 2超过元素个数n。

#include

using namespace std;
//归并排序 非递归实现

const int k = 100;
void merge(int A[], int L1, int R1, int L2, int R2){//将数组A的[L1, R1]与[L2, R2]区间合并为有序区间 L2 = R1+1 
 	int i = L1,j = L2;//i指向L1,j指向L2 
 	int temp[k] , index = 0;//temp临时存放合并后的数组,index为temp数组下标 
 	while(i <= R1 && j <=R2){ 
  		if(A[i] <= A[j]){
   		temp[index++] = A[i++]; //将A[i]加入数组 
  		}else{
   			temp[index++] = A[j++];//将A[j]加入数组 
  		}
 	}
 	//分别将[L1, R1]、[L2, R2]的剩余元素加入数组 
 	while(i <= R1) temp[index++] = A[i++]; 
 	while(j <= R2) temp[index++] = A[j++];
 	for(i = 0; i < index; i++){
  		A[L1 + i] = temp[i];//将合并后的数组赋值回A 
 	}
}
void mergeSort(int A[], int n){
	//step为组内元素个数,step / 2为左区间元素个数
	for(int step = 2; step / 2 <= n; step *= 2){
		//每step个元素一组,组内前step / 2和后step / 2个元素进行合并 
		for(int i = 0; i < n; i += step){ //对每一组进行操作 
			int mid = i + step / 2 - 1;//当前组的中间元素下标 
			if(mid + 1 <= n){
				merge(A, i, mid, mid + 1, min(i + step -1, n-1));
			} 
		}
	}  
}
int main(){
 	int A[7] = {66, 12, 33, 57, 64, 27, 18};
 	mergeSort(A, 7);//归并排序 
 	for(int i = 0; i <=6; i++) cout< 

当然,也可以很快乐地使用sort方法

void mergeSort(int A[], int n){
	for(int step = 2; step / 2 <= n; step *= 2){
		//每step个元素一组,组内前step / 2和后step / 2个元素进行合并
		for(int i = 0; i < n; i += step){
			sort(A + i, A + min(i + step, n));
		}
		//可在此输出每一次归并排序结束的序列 
	}
}
附:

如有错误欢迎各位在评论区指正

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/582347.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号