各种排序算法比较

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)

归并排序比较占用内存,但却是一种效率高且稳定的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simon|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值