2021-3-31 归并排序

采用分治法的排序算法,速度很快

稳定排序

时间复杂度:O(nlogn)

空间复杂度:O(n)

最好情况和最坏情况都是O(nlogn)

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
void GB_sort(vector<int> &arr, int begin, int end);
void merge(vector<int> &arr,int begin,int mid,int end);
int main() {
	int n;
	while (cin >> n) {
		vector<int> arr;
		while (n--)
		{
			int num;
			cin >> num;
			arr.push_back(num);
		}
		//方法
		int begin = 0;
		int end = arr.size()-1;
		GB_sort(arr, begin, end);
		for (auto x : arr) {
			cout << x << " ";
		}
		cout << endl;
	}
	return 0;
}

void GB_sort(vector<int>& arr, int begin, int end) {
	if (begin >= end || arr.size() == 0) {
		return;
	}
	if (begin < end) {
		int mid = (begin + end) / 2;
		GB_sort(arr, begin, mid);
		GB_sort(arr, mid + 1, end);
		merge(arr, begin, mid, end);
	}
}
void merge(vector<int>& arr,int left, int mid, int right) {
	int* temp = new int[right - left + 1];  //申请一个空间来存放合并好的数组(后面需要销毁)
	int st1 = left;  //这里是数组1的开始位置
	int st2 = mid + 1; //这里是数组2的开始位置
	int t = 0; //合并数组的开始位置
	while (st1 <= mid && st2 <= right) {  //这里结束的条件是一个数组已经放进去完了
		//从开始位置比较,如果数组1的元素大于数组2,则将数组2的元素存进去一个,然后位置+1,否则相反
		temp[t++] = arr[st1] <= arr[st2] ? arr[st1++] : arr[st2++];  
                //这里小于等于是因为归并排序是稳定的,不应该影响相同元素的相对位置,但是如果只是< 也不影响排序的结果
	}
	while (st1 <= mid) { //如果是st1没有放完就直接放在最后面
		temp[t++] = arr[st1++];
	}
	while (st2 <= right) { //如果是st2没有放完就直接放在最后面
		temp[t++] = arr[st2++];
	}
	for (int j = 0; j < t; ++j) { //这里把临时创建的数组拷贝到原来的数组中
		arr[left + j] = temp[j];
	}
	delete[] temp; //销毁临时变量

}
posted @ 2021-03-31 16:35  shenlei_blog  阅读(64)  评论(0)    收藏  举报