C++ 之归并排序模板

C++ 之归并排序模板

描述: 归并排序其实是分治的思想。先数组多次分成左边区间和右边区间,直到每个区间只有一个元素的时候开始将左区间和右区间合并(排序的过程在合并中),直到恢复成原来的数组。

#include <iostream>
#include <vector>
using namespace std;

// 合并(排序函数)
void mergeSort(vector<int>& nums, int left, int mid, int right) {

	vector<int> tmp(right - left + 1);  //用来存储本轮已经排序好的数组

	int i = left, j = mid + 1;  // i是左端数组的起点,j是右端数组的起点
	int index = 0;

	while (i <= mid && j <= right) {
		if (nums[i] < nums[j]) {
			tmp[index++] = nums[i++];
		}
		else {
			tmp[index++] = nums[j++];
		}
	}

	// 可能左端数组还有剩下的数字
	while (i <= mid) tmp[index++] = nums[i++];
	// 可能右端数组还有剩下的数字
	while (j <= right) tmp[index++] = nums[j++];

	// tmp是排序好的数组,将tmp的内容拷贝到原始数组nums中
	index = 0;
	for (int k = left; k <= right; ++k) {
		nums[k] = tmp[index++];
	}
	// 到这里,原始数组nums的下标[left, right]部分已经排序好了
	// 由nums的[left, mid] 和 nums的 [mid + 1, right]部分合并而成,因此合并的过程就是排序的过程
}

void merge(vector<int>& nums, int left, int right) {
	// left = right 的时候说明已经只剩下一个数了,所以不再向下分开成左右数组
	if (left < right) {
		int mid = left + ((right - left) >> 1);
		merge(nums, left, mid);  // 拆分左端数组
		merge(nums, mid + 1, right); //拆分右端数组

		mergeSort(nums, left, mid, right); // 将左右数组合并(在合并的过程排序)
	}
}

int main() {

	vector<int> nums = {1, 4, 5, 5, 8, 9, 3, 2};
	
	merge(nums, 0, nums.size() - 1);
	cout << "排序好的数组为:" << endl;
	for (int n : nums) {
		cout << n << " ";
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值