归并排序C++实现

算法简述

归并排序就是利用归并的思想实现的排序方法。假设初始序列含有n个记录,则可将该序列看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到不小于(n/2)的最小整数个长度为2或者1的有序子序列;再两两归并,…,如此重复,直至得到一个长度为n的有序序列为止。下面以初始序列[50,90,10,30,70,40]为例来详细了解该算法的流程。
归并排序算法流程

C++ 递归法实现

递归实现算法

void mergeSortRecursively(vector<int>& originalArray, int lengthArray) {
	int mid;
	if (lengthArray < 2)
		return;
	cout << "原始数组:";
	Print1DArray_int(originalArray);
	mid = lengthArray / 2;
	vector<int> leftArray(mid, 0);
	vector<int> rightArray(lengthArray - mid, 0);
	int i;
	for (i = 0; i < mid; i++)
		leftArray[i] = originalArray[i];
	for (i = mid; i < lengthArray; i++)
		rightArray[i - mid] = originalArray[i];

	cout << "划分后的左子数组:";
	Print1DArray_int(leftArray);
	cout << "划分后的右子数组:";
	Print1DArray_int(rightArray);
	cout << endl;

	mergeSortRecursively(leftArray, mid);
	mergeSortRecursively(rightArray, lengthArray - mid);
	// 排序合并数组
	mergeArray(originalArray, leftArray, mid, rightArray, lengthArray - mid);

	cout << "排序后的数组:";
	Print1DArray_int(originalArray);
	cout << endl;
}

排序后再进行合并

void mergeArray(vector<int>& mergeArray, vector<int>& leftArray, int leftLength, vector<int>& rightArray, int rightLength) {
	// 这里的mergeArray 是合并前的数组,这样就保证合并后的数组大小及元素值不变。
	cout << "开始合并排序数组:";
	Print1DArray_int(mergeArray);

	int leftIndex = 0;
	int rightIndex = 0;
	int mergeIndex = 0;
	while (leftIndex < leftLength && rightIndex < rightLength) {
		if (leftArray[leftIndex] < rightArray[rightIndex])
			mergeArray[mergeIndex++] = leftArray[leftIndex++];
		else
			mergeArray[mergeIndex++] = rightArray[rightIndex++];
	}
	// 处理leftArray或者rightArray提前索引完成
	while (leftIndex < leftLength)
		mergeArray[mergeIndex++] = leftArray[leftIndex++];
	while (rightIndex < rightLength)
		mergeArray[mergeIndex++] = rightArray[rightIndex++];
}

算法结果及分析

int main() {
	cout << "输入排序前的数组:";
	vector<int> numbers;
	int temp;
	while (cin >> temp) {
		numbers.push_back(temp);
		if (cin.get() == '\n')
			break;
	}
	cout << "输入的数组为:";
	Print1DArray_int(numbers);

	mergeSortRecursively(numbers, numbers.size());
	cout << "归并排序后的数组:";
	Print1DArray_int(numbers);
	return 0;
}

Print1DArray_int函数见之前的博文:C++常见的输入输出
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值