我的归并排序总结记录

归并排序模板C++

根据清华大学出版社出版的算法设计与分析(第2版)王红梅 胡明 编著

  • 时间复杂度:O(nlog2n)
  • 首先对要排序的序列划分为两个子序列,直到子序列的长度划分1结束
  • 其次将两个相邻的有序子序列合并,合并方法时间复杂度为 O(n)
  • 归并排序(merge_sort)是按照记录在序列中的位置对序列进行划分
  • 快速排序(quick_sort)是按照记录的值对序列进行划分
  • 两者都是基于分治法,时间复杂度都相同

对代码的解析

//归并排序模板 
#include <iostream>
using namespace std;
//思路将数组n分解成 n 个有序的子数组(即每个数组只有一个元素){  空间复杂度为:O(log2n)	} 
//将相邻的两个有序数组组合成一个有序数组{  空间复杂度为:O(n)	} 
//总的空间复杂度为{  O(nlog2n)} 

//对两个有序数组进行合并
//参数1:将要合并的数组(前半部分和后半部分)
//参数2:临时数组,用来存放排好有序的数组
//参数3:数组第一个元素位置,也是前半部分有序子序列的开始
//参数4:数组中间元素位置,也是前半部分的结束和后半部分的开始
//参数5:数组最后一个元素位置,也是后半部分有序子序列的结束 
void Merge(int arr[],int temp[],int low,int mid,int high)
{	
	int i = low;				//前半部分开始位置
	int j = mid+1;				//后半部分开始位置
	int k = low;				//临时数组temp的下标位置
	while(i <= mid && j <= high)	//如果两个子序列都还有元素 
	{
		if(arr[i] < arr[j]) temp[k++] = arr[i++]; 
		else temp[k++] = arr[j++];
	 } 
	 //假如其中一个子序列没有元素了,则将剩下的所有元素插入 temp数组后面 
	while(i <= mid)	temp[k++] = arr[i++];
	while(j <= high) temp[k++] = arr[j++];
}

//对数组进行划分
//参数1;进行划分的数组
//参数2:数组第一个元素
//参数3:数组最后一个元素 
void Merge_sort(int arr[],int low,int high)
{
	int mid;					//中间值
	int  temp[100];				//临时数组,用来存放有序数组
	//设置出口
	if(low == high)	return;  	//当low和high一样时,则数组中只有一个元素 
	else{
		mid = (low + high)/2;			//获取中间值,划分 
		Merge_sort(arr,low,mid);		//求解子问题1:归并排序前半个子序列
		Merge_sort(arr,mid+1,high);		//求解子问题2:归并排序后半个子序列
		Merge(arr,temp,low,mid,high);	//合并两个有序子序列,存放进数组temp中 
		//将临时数组中的数据转移到 arr 数组中
		for(int i = low; i <= high; i++)
			arr[i] = temp[i];
	}
}

int main(int argc, char** argv) {
	int arr[8];
	for(int i = 0; i < 8; i++)
	{
		cin >> arr[i];
	 } 
	Merge_sort(arr,0,7);
	for(int i = 0;i < 8; i++)
	{
		cout << arr[i] << "   ";
	}
	return 0;
}

精简版模板

void Merge(int arr[],int temp[],int low,int mid,int high)
{	
	int i,j,k;
	i = k = low;j = mid+1;
	while(i <= mid && j <= high)	
	{
		if(arr[i] < arr[j]) temp[k++] = arr[i++]; 
		else temp[k++] = arr[j++];
	 } 
	while(i <= mid)	temp[k++] = arr[i++];
	while(j <= high) temp[k++] = arr[j++];
}
void Merge_sort(int arr[],int low,int high)
{
	int mid,temp[100];
	if(low == high)	return;  
	else{
		mid = (low + high)/2;			
		Merge_sort(arr,low,mid);	
		Merge_sort(arr,mid+1,high);		
		Merge(arr,temp,low,mid,high);	
		for(int i = low; i <= high; i++)
			arr[i] = temp[i];
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值