排序算法之归并排序【C++】

 图解(来源于网络)

 

别的大佬的一个讲解归并排序的视频

 代码详解

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

void Merge_sort(vector<int>&array, vector<int>&tempArray, int left, int right);
void merge(vector<int>&array, vector<int>&tempArray, int left, int mid, int right);
void Arr_print(vector<int>arr);
//归并的入口函数
void Merge_sort(vector<int>&array, vector<int>&tempArray, int left, int right) {
	int mid = (left + right) / 2;	//获得中间元素的下标,将数组一分为二
	if (left < right)
	{
		Merge_sort(array, tempArray, left, mid);		//左半部分数组一分为二
		Merge_sort(array, tempArray, mid+1, right);		//右半部分数组一分为二
		merge(array, tempArray, left, mid, right);	//将上面一分为二的部分归并排序
		Arr_print(array);
	}
}
void merge(vector<int>&array, vector<int>&tempArray, int left, int mid, int right)
{
	//左边区域第一个没有排序的元素下标
	int l_index = left;
	//右边区域第一个没有排序的元素下标
	int r_index = mid + 1;
	//临时数组开始的元素下标
	int temp_index = left;
	//复制时候的开始下标
	int copy_index = left;
	//开始合并
	while (l_index <= mid && r_index <= right) {
		// 比较两段元素中头元素的大小,取最小的元素放入临时数组中
		if (array[l_index] < array[r_index])
			tempArray[temp_index++] = array[l_index++];
		else
			tempArray[temp_index++] = array[r_index++];
	}
		//若左半边元素有剩余
		while(l_index<=mid)
			tempArray[temp_index++] = array[l_index++];

		//若右半边元素有剩余
		while(r_index<=right)
			tempArray[temp_index++] = array[r_index++];

		//将临时数组中的数据,此时已经排好顺序,拷贝到原数组中
		while (copy_index <= right) {
			array[copy_index] = tempArray[copy_index];
			copy_index++;
		}

}
//打印数组函数
void Arr_print(vector<int>arr)
{
	for (auto a : arr)
		cout << a;
	cout << endl;
}
int main()
{
	vector<int>arr = { 8,7,6,5,4,3,2,1};
	cout << "原数组为:" << endl;;
	Arr_print(arr);
	cout << "开始归并" << endl;
	vector<int>tempArr;
	tempArr.resize(arr.size());
	int start_index = 0;
	int end_index = arr.size() - 1;
	Merge_sort(arr, tempArr, start_index, end_index);
}

 输出为

原数组为:
87654321
开始归并
78654321
78564321
56784321
56783421
56783412
56781234
12345678

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值