[算法]-快速排序

快速排序

  • 思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
  • 步骤:
    • 1.判断递归终止条件,即出口
    • 2.记录数组的第一个元素为哨兵(轴点),让其他元素与之比较,(哨兵值的下标是要被空出来的)
    • 3.先开始从数组后面找到第一个比哨兵小的元素 A ,将其填入哨兵值的下标的位置上面(记住 不是替换哨兵值 ),此时元素 A 的位置空了出来
    • 4.再从数组最前面开始找到第一个比哨兵大的元素 B ,将其填入上一步 元素A空出来的位置
    • 5.循环 3 4两步 直到前后碰面后,将哨兵值放入值那个最后元素下标位置
    • 6.此时哨兵值左边全是小于它的数,右边全是大于它的数,对两边进行递归调用,完成排序。
#include<iostream>
using namespace std;
void quicksort(int a[],int low,int high){
	if(low>=high){//碰面了 此时已经分割完毕 
		return; 
	}
	int first=low;
	int last=high;
	int key=a[first];//定义一个轴点  
	while(first<last){
		while(first<last&&a[last]>=key){
			--last;//先从最右边开始找 如果没有找到比key小的值就一直减少 
		}
		a[first]=a[last];//在右边找到了第一个比Key小的值 将其移到first的位置
		while(first<last&&a[first]<=key){//然后再从最左边开始找 如果没有找到比Key大的值就一直增大 
			++first;
		} 
		a[last]=a[first];//在左边找到了第一个比Key大的值 将其移到last空缺的位置 
	} 
	a[first]=key;//此时将枢轴记录到位 归位 此时a[first](Key值)左侧全是比其小的数,右侧全是比其大的数
	quicksort(a,low,first-1);
	quicksort(a,first+1,high);//将左右两部分尚未排完序的部分继续递归 
} 
int main(){
	int a[]={23,55,66,24,63,43,27,77};
	quicksort(a,0,7);
	for(int i=0;i<8;i++){
		cout<<a[i]<<" ";
	}
	return 0;
} 
  • 时间复杂度:最坏情况下效率为O( n 2 n^2 n2),每次平分完后,只能分成一个元素和剩余其他元素,退化成了冒泡排序的情况
    大多数情况下,根据递归树深度 l o g 2 n + 1 log_2n+1 log2n+1,递归 l o g 2 n log_2n log2n次,快速排序算法的平均效率可以达到O(nlogn)。
  • 空间复杂度:这个比较难计算…主要取决于递归时栈的空间消耗,最优情况O(logn) ,最差情况O(n)
  • 稳定性:不稳定 选取轴点 进行交换时会破坏相对顺序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值