八大排序-快排及优化

一、方法

     核心市分治

     定基准,设置两个指针,从右边开始,如果遇到比基准小的就和左边的交换,之后从左边找,遇到比基准大的就和右边的交换,直到两指针相遇,将基准放入相遇位置,该位置前面都比基准小,后面都比基准大

二、时间空间复杂度

时间复杂度:
最坏情况下,时间复杂度是O(n^2);
最优情况下,时间复杂度是O(nlogn);
平均时间复杂度是O(nlogn);

空间复杂度:O(logn),递归调用

三、代码实现优化

1.递归

int Partion(vector<int>& s, int left, int right) {
	int tmp = s[left];
	while (left < right) {
		while (left < right && s[right] > tmp) --right;
		if (left < right)	s[left] = s[right];
		while (left < right && s[left] <= tmp)	left++;
		if (left < right)	s[right] = s[left];
	}
	s[left] = tmp;
	return left;
}
void sort_s(vector<int>& s, int left, int right) {
	if (left < right) {
		int pos = Partion(s, left, right);
		sort_s(s, left, pos - 1);
		sort_s(s, pos + 1, right);
	}
}


int main() {
	vector<int> s = { 1,4,6,23,8 };
	sort_s(s, 0 ,s.size() - 1);

	for (int i = 0; i < s.size(); ++i) {
		cout << s[i]<<" ";
	}


	return 0;
}

2.非递归

int Partion(vector<int>& s, int left, int right) {
	int tmp = s[left];
	while (left < right) {
		while (left < right && s[right] > tmp) --right;
		if (left < right)	s[left] = s[right];
		while (left < right && s[left] <= tmp)	left++;
		if (left < right)	s[right] = s[left];
	}
	s[left] = tmp;
	return left;
}
void sort_s(vector<int>& s, int left, int right) {
	queue<int> qu;
	qu.push(left);
	qu.push(right);
	while (!qu.empty()) {
		left = qu.front();
		qu.pop();
		right = qu.front();
		qu.pop();
		int pos = Partion(s, left, right);
		if (left < pos - 1) {
			qu.push(left);
			qu.push(pos - 1);
		}
		if (pos + 1 < right) {
			qu.push(pos + 1);
			qu.push(right);
		}
	}
}

3优化,三位取中

int Mid_num(vector<int>& s, int left, int right) {
	int mid = (left + right )>> 1;
	if (s[left] > s[mid]) {
		if (s[left] > s[right]) {
			if (s[mid] > s[right]) {
				return mid;
			}
			else {
				return right;
			}
		}
		else {
			return left;
		}
	}
	else {
		if (s[left] < s[right]) {
			if (s[mid] < s[right]) {
				return mid;
			}
			else {
				return right;
			}
		}
		else {
			return left;
		}
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值