1.快速排序
void quick_sort(vector<>int &q, int left, int right){
if(left > right) //截止条件:左右游标相遇
return;
int i = left - 1; //-1,+1是为了后面while内保证两边端点元素加入判断
int j = right + 1;
int x = q[(left + right)/2];
//将数据分成两部分:第一部分小于基数,第二部分大于基数
while(i < j){
do ++i;while(q[i] < x); //找出左边第一个大于等于x的元素A
do --j;while(q[j] > x); //找出右边第一个小于等于x的元素B
if(i <j) swap(q[i], q[j]); //如果A在B的左边,则交换A和B
}
quick_sort(q, left, j); //对第一部分进行快速排序
quick_sort(q, j+1, right); //对第二部分进行快速排序
}
2.稳定性
快速排序是一个不稳定排序算法。
那么到底什么才是排序的稳定性呢,通俗的讲有两个相同的数A和B,在排序之前A在B的前面,而经过排序之后,B跑到了A的前面,对于这种情况的发生,我们管他叫做排序的不稳定性,而快速排序在对存在相同数进行排序时就有可能发生这种情况。
例如(5,3A,6,3B)对这个进行排序,排序之前相同的数3A与3B,A在B的前面,经过排序之后会变成
(3B,3A,5,6),所以说快速排序是一个不稳定的排序
3.时间复杂度
最优情况:每一次的flag刚好都可以平分整个数组,此时的时间复杂度为O(nlogn)
最坏情况:每一次的flag刚好都是最大或者最小的数,此时的时间复杂度为O(n2)
平均情况:经过推到平均情况为O(nlogn)