递归实现归并排序---c++

递归形式----归并排序

递归主要的实质就在左右排好序的数组如何重排在一起
在这里插入图片描述
这里要特别注意一点

	int left_index = start;//左边数组起始位置计数器
	int right_index = start + mid+1;//右边数组起始位置mid+1+start计数器

在这里插入图片描述

在这里插入图片描述
start一定要写,为什么呢?我一开始认为start我传入的时候是0啊,加不加都无所谓啊。但是在递归的过程中,例如红框划出来的地方,在递归过程中传入的start实际上是(end - start + 1) / 2 + start + 1,图上的start就是3

merge_sort(data, (end - start + 1) / 2 + start + 1, end, result);//右边起始点mid+1`

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <time.h>
#define  Max 20
using namespace std;

void merge(int *data, int start, int end, int *result);

void merge_sort(int *data, int start, int end, int *result)
{
	if (1 == end - start)//如果区间中只有两个元素,则对这两个元素进行排序(1-0=1)
	{
		if (data[start] > data[end])//这里是升序排序,前面数字比后方大就交换
		{
			int temp = data[start];
			data[start] = data[end];
			data[end] = temp;
		}
		return;//如果data[start] < data[end]就结束
	}
	if (0 == end - start)//如果只有一个元素,则不用排序
		return;
	
		//继续划分子区间,分别对左右子区间进行排序
		merge_sort(data, start, (end - start + 1) / 2 + start, result);//左边结束点下标mid=(end - start + 1) / 2 + start
		merge_sort(data, (end - start + 1) / 2 + start + 1, end, result);//右边起始点mid+1
		//开始归并已经排好序的start到end之间的数据
		merge(data, start, end, result);//归并数据
		//把排序后的区间数据复制到原始数据中去
		for (int i = start; i <= end; ++i)
			data[i] = result[i];

}

void merge(int *data, int start, int end, int *result)//源数组,起始节点下标,结束点下标,整合结果数组
{
	int mid = (end - start + 1) / 2;
	int left_Max = mid + 1;//左部分区间的数据元素的个数mid+1(因为左边末尾节点为mid,数组下标从0开始)
	int left_index = start;//左边数组起始位置计数器
	int right_index = start + mid+1;//右边数组起始位置mid+1+start计数器
	int result_index = start;
	while (left_index < start + left_Max && right_index < end + 1)//左边计数器和右边计数器不越界
	{
		//对分别已经排好序的左区间和右区间进行合并
		if (data[left_index] <= data[right_index])//左右两部分数组比较
			result[result_index++] = data[left_index++];//谁小就赋值给结果数组,然后结果计数器和该赋值数组计数器++
		else
			result[result_index++] = data[right_index++];
	}
	while (left_index < start + left_Max)//左边计数器还没满,代表右部分已经全部入数组,因为左右都是已经排好序的数组,下面只要将左部分加入即可
		result[result_index++] = data[left_index++];
	while (right_index < end + 1)//右边计数器还没满,代表左边已经完全进入数组
		result[result_index++] = data[right_index++];
}

int main()
{

	srand((unsigned int)time(NULL));//随机数
	int num[Max];
	for (int i = 0; i < Max; ++i)
	{
		int mum = rand() % Max;//随机数种子
		num[i] = mum;
	}
	int result[Max];//辅助数组
	cout << "Before sorted:" << endl;
	for (int i = 0; i < Max; ++i)
		cout << num[i] << "  ";
	cout << endl;
	cout << "After sorted:" << endl;
	merge_sort(num, 0, Max - 1, result);
	for (int i = 0; i < Max; ++i)
		cout << num[i] << "  ";
	cout << endl;

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值