递归实现归并排序---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;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归并排序是一种经典的排序算法,它的基本思想是将待排序数组分成两个部分,将每个部分分别进行排序,最后将排好序的两个部分合并成一个有序的数组。下面是一份不使用递归实现归并排序C++ 代码: ```cpp #include <iostream> #include <vector> using namespace std; void merge(vector<int>& nums, int left, int mid, int right) { vector<int> tmp(right - left + 1); int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (nums[i] <= nums[j]) { tmp[k++] = nums[i++]; } else { tmp[k++] = nums[j++]; } } while (i <= mid) { tmp[k++] = nums[i++]; } while (j <= right) { tmp[k++] = nums[j++]; } for (int p = 0; p < k; ++p) { nums[left + p] = tmp[p]; } } void mergeSort(vector<int>& nums) { int n = nums.size(); for (int step = 1; step < n; step *= 2) { for (int i = 0; i < n - step; i += step * 2) { int left = i; int mid = i + step - 1; int right = min(i + step * 2 - 1, n - 1); merge(nums, left, mid, right); } } } int main() { vector<int> nums = {3, 5, 1, 4, 2, 6}; mergeSort(nums); for (int num : nums) { cout << num << " "; } cout << endl; return 0; } ``` 该程序的主要思路是:按照步长(step)将数组分为若干个长度为step的子数组,然后将相邻的两个子数组合并成一个有序的大数组,直到整个数组排好序。需要注意的是,在合并两个子数组时,需要开辟一个临时数组来存放排好序的元素,最后再将排好序的元素复制回原数组

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值