十大排序算法之快速排序(QuickSort)

一、前言
数据结构与算法,顺便刷leetcode,无意间发现了一个 我觉得讲解的比较好的网页,并且会拿leetcode里面的题目当做例题,如有需要,奉上网址:五分钟学算法

二、算法的介绍

  1. 选取两个哨兵i,j哨兵i指向序列的最前端,哨兵j指向序列的最后端,选取一个基准点。
  2. 判断哨兵i指向的元素是否大于基准点?若小于,则哨兵i后移一位,若大于,则哨兵i动。
  3. 判断哨兵j指向的元素是否大于基准点?若大于,则哨兵j前移一位,若小于于,则哨兵i动。
  4. 交换哨兵i,哨兵j指向的两个元素,然后重复上诉操作,直至i,j相遇。此时基准点左边的元素全部小于基准点,右边的元素全部大于基准点。
  5. 更换基准点,在原来基准点的左边和右边在此重复1-4的操作,直至所有元素全部排列完毕。

三、算法的图示(图片来源于网络)
图一
快速排序
图二
快速排序
图三
快速排序
四、代码

#include <iostream>
using namespace std;
void QuickSort(int* dps,int low,int high)
{
	int i=low;//哨兵i,j
	int j=high;
    int tmp=dps[i];//基准点
	while(i<j)
	{
		while(i<j && dps[j]>=tmp)
			j--;
		dps[i]=dps[j];
		while(i<j && dps[i]<=tmp)
			i++;
		dps[j]=dps[i];//交换元素
	}
	dps[i]=tmp;
	QuickSort(dps,low,i-1);重复上述操作
	QuickSort(dps,i+1,high);
}
int main()
{
    int num;
	cout<<"请输入序列中元素的个数"<<endl;
	cin>>num;
	int dp[num];
	for(int i=0;i<num;i++)
	    cin>>dp[i];
	QuickSort(dp,0,num-1);
	for(int i=0;i<num;i++)
	    cout<<dp[i]<<" "
    return 0;
}

五、算法的性质

  1. 稳定性:相同元素的相对位置可能发生改变,故该算法不稳定。
  2. 空间复杂度:快速排序使用的空间是O(1)的;而真正消耗空间的就是递归调用,每一趟排序都将元素序列均匀地分割成长度相近的两个子表,所需栈的最大深度为log2(n+1);但最坏的情况下,栈的最大深度为n。这样,快速排序的空间复杂度为O(log2n))。
  3. 时间复杂度:每次划分所选择的中间数恰好将当前序列几乎等分,经过log2n趟划分,便可得到长度为1的子表。这样,整个算法的时间复杂度为O(nlog2n),最坏的情况为O(n2);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值