快速排序 最坏时间复杂度

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)

猜你喜欢

转载自blog.csdn.net/weixin_43202635/article/details/115425454