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; //销毁临时变量
}
浙公网安备 33010602011771号