一、前言
数据结构与算法,顺便刷leetcode,无意间发现了一个 我觉得讲解的比较好的网页,并且会拿leetcode里面的题目当做例题,如有需要,奉上网址:五分钟学算法
二、算法的介绍
- 选取两个哨兵i,j哨兵i指向序列的最前端,哨兵j指向序列的最后端,选取一个基准点。
- 判断哨兵i指向的元素是否大于基准点?若小于,则哨兵i后移一位,若大于,则哨兵i动。
- 判断哨兵j指向的元素是否大于基准点?若大于,则哨兵j前移一位,若小于于,则哨兵i动。
- 交换哨兵i,哨兵j指向的两个元素,然后重复上诉操作,直至i,j相遇。此时基准点左边的元素全部小于基准点,右边的元素全部大于基准点。
- 更换基准点,在原来基准点的左边和右边在此重复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;
}
五、算法的性质
- 稳定性:相同元素的相对位置可能发生改变,故该算法不稳定。
- 空间复杂度:快速排序使用的空间是O(1)的;而真正消耗空间的就是递归调用,每一趟排序都将元素序列均匀地分割成长度相近的两个子表,所需栈的最大深度为log2(n+1);但最坏的情况下,栈的最大深度为n。这样,快速排序的空间复杂度为O(log2n))。
- 时间复杂度:每次划分所选择的中间数恰好将当前序列几乎等分,经过log2n趟划分,便可得到长度为1的子表。这样,整个算法的时间复杂度为O(nlog2n),最坏的情况为O(n2);