1.归并排序
#include <iostream>
using namespace std;
#include <vector>
class Solution
{
public:
vector<int> mergeSort(vector<int> data)
{
gao(data, 0, data.size()-1);
return data;
}
void gao(vector<int> &data, int l, int r)
{
if (l < r)
{
cout << l <<"\t"<< r << endl;
int mid = (l + r) / 2;
gao(data, l, mid);
gao(data, mid + 1, r);
merge(data, l, mid,r);
for each(int i in data)
cout << i << "\t";
cout << endl;
}
}
void merge(vector<int> &data, int l, int mid ,int r)
{
vector<int> temp(data.size(),0);
int lend = mid;
int rend = r;
int index = r;
while (lend >= l && rend >= mid + 1)
{
if (data[lend] > data[rend])
temp[index--] = data[lend--];
else
temp[index--] = data[rend--];
}
for (;lend>=l;lend--)
temp[index--] = data[lend];
for (; rend >= mid+1; rend--)
temp[index--] = data[rend];
for (int i = l; i <= r; i++)
data[i] = temp[i];
}
};
int main()
{
Solution s;
vector<int> a = { 7, 6, 5, 4, 3, 2, 1 };
vector<int> ans = s.mergeSort(a);
cout << endl;
system("pause");
return 0;
}
稳定的,归并排序使得了递归的思想,把序列递归的分割成小序列,然后合并排好序的子序列.当有序列的左右两子序列合并的时候一般是先遍历左序列,所在左右序列如果有相等元素,则处在左边的仍然在前,这就稳定了.但是如果你非得先遍历右边序列则算法变成不稳定的了.虽然这样排出来的序也是对的,但变成了不稳定的,所以是不太好的实现.
时间复杂度为O(nlog₂n)
空间复杂度为 O(n)
比较操作的次数介于(nlogn) / 2和nlogn - n + 1。
赋值操作的次数是(2nlogn)
归并排序比较占用内存,但却是一种效率高且稳定的算法。