【C++】归并排序实现

基本过程

采用分治的核心思想,把一个复杂问题拆成若干子问题求解。
通过递归的方法,不断对左右两部分进行拆分
比较左右两部分大小,不断将左右两部分按顺序合并

代码实现

#include<iostream>
#include<vector>

using namespace std;

void merge(vector<int>& nums, int low, int mid, int high);//声明

void sort(vector<int>& a, int low, int high) {
	if (low >= high) return;//看是否只剩最后一个元素了
	int mid = low + (high - low) / 2;//把数组分成左右两半
	sort(a, low, mid);//与下一句一起,递归地把数组左右两半排好序
	sort(a, mid + 1, high);
	merge(a, low, mid, high);//把排好序的数组合并起来
}

void merge(vector<int> &nums, int low, int mid, int high) {
	vector<int> copy(nums);//后面会修改原数组
	int k = low, i = low, j = mid + 1;//k表示从什么位置开始修改原来的数组,i表示左半边的起始位置,j表示右半边的起始位置

	while (k <= high) {
		if (i > mid) {//左半边的数都处理完毕了,只剩右半边的数。只需把右边的数逐个拷贝上去就行了
			nums[k++] = copy[j++];
		}
		else if (j > high) {//右半边的数都处理完毕了,只剩左半边的数。只需把左边的数逐个拷贝上去就行了
			nums[k++] = copy[i++];
		}
		else if (copy[j] < copy[i]) {//右边的数小于左边的数,将右边的数拷贝上去一个
			nums[k++] = copy[j++];
		}
		else {//左边的数小于右边的数,将左边的数拷贝上去一个
			nums[k++] = copy[i++];
		}
	}
}

//打印数组
void printVector(const vector<int>& a) {
	for (auto i : a) {
		cout << i << " ";
	}
	cout << endl;
}

int main(int argc, char** argv) {
	vector<int> a{ 5,6,4,2,3 };
	sort(a,0,a.size()-1);
	printVector(a);

	return 0;
}
原创文章 97 获赞 33 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qionggaobi9328/article/details/105676962