排序之快速排序(出现概率极高的面试题!!!)

原理

快速排序是对冒泡排序的改进,采用了分治策略(一般也会使用递归),因此减少了比较的次数。

基本思想

  1. 设置一个基准值,这个基准点可以随意设置,但是一般来说我们选择第一个数据。
  2. 用left标识数组的第一个数据,right标识数组的最后一个数据
  3. 如果right位上的数据大于基准值,则继续往后遍历(right- -);如果小于基准值,则将right位上的值赋值给left位。
  4. 让left往前遍历, 如果left位上的数据小于基准值,则继续往前遍历(left++);如果left位上的值大于基准值,则将left位上的值赋值给right位。
  5. 知道left==right这一趟排序就结束了,将基准值赋值给left位
  6. 再采用递归的方法将基准值位左边与右边的两部分数组分别进行快速排序。前半部分和后半部分均有序时该数组就自然有序了。

代码实现

//排序
int getindex(int a[],int left,int right){
    int num=a[0]; 
    while(left<right){
        while(left<right&&a[right]>num){
           right--;
        }
        a[left]=a[right];
        while(left<right&&a[left]<num){
           left++;
        }
        a[right]=a[left];
    }
    a[left]=num;
    return left;
}

void QuickSort(int a[],left,right){
    if(left<right){
       int index=getindex(a,left,right);
    }
    QuickSort(a,left,index-1);
    QuickSort(a,index+1,right);
}

快速排序之所以快,是因为相比冒泡排序,它每次交换都是跳跃式的,不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多。因此总的比较和交换次数就少了,速度自然就提高了。

快速排序的特性总结

时间复杂度:O(NlogN)(最坏情况下O(N^2));
空间复杂度:O(log2N)
稳定性:不稳定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值