栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C/C++语言重温------排序之归并排序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C/C++语言重温------排序之归并排序

C/C++语言重温------排序之归并排序


#include

using namespace std;

// 模板获取数组长度的方法
template 

int getSize(T(&input)[N]) {
	return sizeof(input) / sizeof(T);
}

// 定义数组长度为全局变量
int arr_length = 0;

// 输出数组
void display_arr(int *arr) 
{

	for (int i = 0; i < arr_length; i++)
	{
		cout << "arr[" << i << "]:" << arr[i] << endl;
	}
}



// 归并排序递归函数主体
void merge_sort_recursive(int arr[], int arrCopy[], int start, int end) {
	

	if (start >= end)
		return;

	int len = end - start, mid = (len >> 1) + start;
	// 左半边数组起止位置
	int leftStart = start, leftEnd = mid;
	// 左半边数组起止位置
	int rightStart = mid + 1, rightEnd = end;

	// 左半边数组排序
	merge_sort_recursive(arr, arrCopy, leftStart, leftEnd);
	// 右半边数组排序
	merge_sort_recursive(arr, arrCopy, rightStart, rightEnd);

	int k = start;

	// 先比较两个数组,进行排序
	while (leftStart <= leftEnd && rightStart <= rightEnd) 
	{
		arrCopy[k++] = arr[leftStart] < arr[rightStart] ? arr[leftStart++] : arr[rightStart++];
	}

	// 接着将左边剩余元素或右边剩余元素放到数组尾部
	while (leftStart <= leftEnd)
	{
		arrCopy[k++] = arr[leftStart++];
	}

	while (rightStart <= rightEnd)
	{
		arrCopy[k++] = arr[rightStart++];
	}

	// 将排序好的数组复制给原数组
	for (k = start; k <= end; k++)
		arr[k] = arrCopy[k];
}


void merge_sort(int arr[], const int len) {

	// 开辟存放数组的空间
	int* arrCopy = (int*)malloc(len * sizeof(arr[0]));

	// 递归函数排序
	merge_sort_recursive(arr, arrCopy, 0, len - 1);
}


int main(int argc, char const *argv[])
{
	int arr[]  = { 5, 6, 1, 9, 2, 4, 3, 7, 10, 8 };

	arr_length = getSize(arr);

	display_arr(arr);
	
	// 归并排序
	merge_sort(arr, arr_length);

	display_arr(arr);

	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743520.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号