数据结构排序算法之归并排序

文章目录


代码实现

#include<iostream>

using namespace std;
typedef int elemtype;
//归并排序
void MergeSort(elemtype arr[], int n);
void Msort(elemtype arr[], elemtype temp[], int left, int right);
void merge(elemtype arr[], elemtype temp[], int left, int mid, int right);
//int main()
//{
//	//elemtype arr[10] = { 2,4,6,1,3,5,10,9,8,7 };
//	elemtype arr[8] = { 4,2,5,7,3,1,8,6 };
//	HeapSort(arr,8);
//	for (int i = 0; i < 8; i++)
//	{
//		cout << arr[i] << " ";
//	}
//
//	return 0;
//}

//归并排序
/*
归并排序更多的需要自己去画图实践体会,只是从代码上还是不能有更多的感触

*/
void MergeSort(elemtype arr[], int n)
{
	elemtype* temp = new elemtype[n];	//申请一块辅助排序的空间
	Msort(arr, temp, 0, n - 1);			//进入到递归分治中
	delete[] temp;						//排序完成,释放申请的空间
}
//将空间二分至最小单元
void Msort(elemtype arr[], elemtype temp[],int left, int right)
{
	if (left < right)					//left<right  说明空间还可以继续二分直到剩下单个元素
	{
		int mid = (left + right) / 2;	//找到区间的中间下标
		Msort(arr, temp, left, mid);	//进入到区间的左边
		Msort(arr, temp, mid + 1, right);//进入到区间的右边
		merge(arr, temp, left, mid, right);	//进行合并排序
	}
}
//合并空间
void merge(elemtype arr[], elemtype temp[], int left, int mid, int right)
{
	int l_pos = left;				//l_pos是左边区间的起始下标
	int r_pos = mid + 1;			//r_pos是右边区间的起始下标
	int pos = left;					//pos是在申请数组中需要开始排序元素的起始下标
	while (l_pos <= mid && r_pos <= right) //对两个区间中的元素进行比较排序
	{
		if (arr[l_pos] < arr[r_pos])		//左边小于右边,因此将左边元素排入申请的temp数组中
			temp[pos++] = arr[l_pos++];
		else								//右边小于左边,因此将右边元素排入申请的temp数组中
			temp[pos++] = arr[r_pos++];
	}
	//从上一个循环中出来就必定满足了其中一个条件,说明至少有一边区间的元素已经排好了
	//因此接下来就分开对两个区间判断有没有排完,如果没有排完就直接将剩余元素全部按顺序赋进去即可
	while (l_pos <= mid)
		temp[pos++] = arr[l_pos++];
	while (r_pos <= right)
		temp[pos++] = arr[r_pos++];
	while (left <= right)			//最后将temp数组中正确的顺序返回给arr数组
	{
		arr[left] = temp[left];
		left++;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值