2019-12-10(算法-快速排序)

快速排序(Quick Sort)

快速排序由C. A. R. Hoare在1962年提出。
是对冒泡排序的一种改进,基本思想是选取一个记录作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另一部分都大于枢轴。然后继续对这两部分继续进行排序,从而使整个序列达到有序。

思路分析

  • 快速排序,说白了就是给基准数据找其正确索引位置的过程.

  • 快速排序的思想就是,选一个数作为基数(这里我选的是第一个数),大于这个基数的放到右边,小于这个基数的放到左边,等于这个基数的数可以放到左边或右边,看自己习惯,这里我是放到了左边,一趟结束后,将基数放到中间分隔的位置,第二趟将数组从基数的位置分成两半,分割后的两个的数组继续重复以上步骤,选基数,将小数放在基数左边,将大数放到基数的右边,在分割数组,,,直到数组不能再分为止,排序结束。

例如从小到大排序:

  1. 第一趟,第一个数为基数temp,设置两个指针left = 0,right = n.length,
      ①从right开始与基数temp比较,如果n[right]>基数temp,则right指针向前移一位,继续与基数temp比较,直到不满足n[right]>基数temp
      ②将n[right]赋给n[left]
      ③从left开始与基数temp比较,如果n[left]<=基数temp,则left指针向后移一位,继续与基数temp比较,直到不满足n[left]<=基数temp
      ④将n[left]赋给n[rigth]
      ⑤重复①-④步,直到left==right结束,将基数temp赋给n[left]
  2. 第二趟,将数组从中间分隔,每个数组再进行第1步的操作,然后再将分隔后的数组进行分隔再快排,
  3. 递归重复分隔快排,直到数组不能再分,也就是只剩下一个元素的时候,结束递归,排序完成

根据思路分析,第一趟的执行流程如下图所示:


动图展示

代码实现

public static void quickSort(int[] num,int left,int right){
      //递归的出口
    if(left>=right){
        return;
    }
    //获取基准值所在的索引
    int res = particular(num,left,right);
    //对左区间进行排序
    quickSort(num,left,res-1);
    //对右区间进行排序
    quickSort(num,res+1,right);
}
public static int particular(int[] num,int left,int right){
    //确定一個基准值,这里的基准值确定为最右边的数
    int base = num[right];
    while(left<right){
        while(num[left]<base&&left<right){
            left++;
        }
        if(left<right){
            num[right]=num[left];
            right--;
        }
        while(num[right]>base&&left<right){
            right--;
        }
        if(left<right){
            num[left]=num[right];
            left++;
        }
    }
    //循环结束
    //此时left==right,而这个位置就是基准值在数组中应该在的位置
    num[left]=base;
    //最后返回基准值所在的位置
    return left;
}

复杂度:

时间复杂度:O(nlogn)

  • 最好情况(待排序列接近无序)时间复杂度为O(nlog2n),最坏情况(待排序列接近有序)时间复杂度为O(n2),平均时间复杂度为O(nlog2n)。

空间复杂度

  • 空间复杂度:快速排序使用递归,递归使用栈,因此它的空间复杂度为O(logn)
    稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 3,942评论 0 0
  • 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对...
    Demon_code阅读 4,704评论 0 2
  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! 1.冒泡排序(Bub...
    王饱饱阅读 5,789评论 0 7
  • 今天我在,学校里拿到我们的校刊,名字叫《紫藤花下》 这本书里有我们,多年以前的记载。 我们小学里有一颗悬铃木,喜欢...
    谷松林阅读 2,118评论 0 0
  • 喝茶在我们看来,只是一种日常的习惯:有时是追尝每季的新茶,有时是喜欢某种茶味,又或许只是单纯想要淡淡的茶水来解渴。...
    知创快讯阅读 1,760评论 0 1

友情链接更多精彩内容