归并排序
算法目的:
将无序数列排为有序数列。
动态演示:
.
算法思想:
利用分治法,将待排序数组不断细分,最后利用递归从小至大合并回原来摸样。
算法代码:
时间 O(n*log n) 空间O(n)
#include<iostream>
#include<vector>
using namespace std;
//归并排序
void guibing(vector<int>& arr)
{
int len = arr.size();
//拆终点判定
if (len / 2 > 0)
{
//创建两个子数组
vector<int> lv(arr.begin(), arr.begin() + len / 2);
vector<int> rv(arr.begin() + len / 2, arr.end());
//对子数组继续拆
guibing(lv);
guibing(rv);
//合并
for (int i = 0; i < len; ++i)
{
//左右数组不为空
if (!lv.empty() && !rv.empty())
{
//判断左右大小
if (lv.back() > rv.back())
{
//大的覆盖arr倒数第i个元素
arr[len-1-i] = lv.back();
//剔除元素
lv.pop_back();
}
//同理
else
{
arr[len - i - 1] = rv.back();
rv.pop_back();
}
}
//左边不为空
else if (!lv.empty())
{
//将子数组末尾元素覆盖给arr倒数第i个元素
arr[len - i - 1] = lv.back();
lv.pop_back();
}
//右边不为空
else
{
arr[len - i - 1] = rv.back();
rv.pop_back();
}
}
}
}
int main ()
{
vector<int> arr = { 5,6,8,5,9,4,2,3,1,7,5 };
guibing(arr);
for (auto a : arr)
{
cout << a << " ";
}
cout << endl;
return 0;
}
……