快速排序

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

基本思想

1.在一列数组中取一个数作为基数

2.分区过程,先从右边开始小于这个基数的值放在左边,在从左边开始把大于基数的值放入右边

3.递归基数左边和右边区间重复第二部,直到只有一个值结束

图解

初始值

image

右边找小于基数的数值

  • 挖坑,因为我们要交换位置所以要挖一个坑出来
image
  • 把基数放入到坑中我们这里选6位基数,然后在右边找数填左边的坑。


    image
  • 右边开始找找到3比基数6小,交换它们的位置。

image

左边找大于基数的数值

  • 左边开始找到了7大于基数的数字,交换位置后的值。
image

重复以上步骤,知道i和j相等的时候结束第一次排序

  • 分区排序完后的值
image
static void quick(int s[], int l, int r) {
        //保证区间起码有一位数
        if (l < r) {
            int i = l;
            int j = r;
            int x = s[l];
            //i<j保证 left的i和right的j不会重合
            while (i < j) {
                //找小于等于x的数,如果是大于就j--继续往前走。
                while (i < j && s[j] >= x) {
                    j--;
                }
                if (i < j) {
                    s[i] = s[j];
                }
                //找大于等于x的数,如果小于就i++继续往前走
                while (i < j && s[i] <= x) {
                    i++;
                }
                if (i < j) {
                    s[j] = s[i];
                }
            }
            s[i] = x;
            quick(s, l, i - 1);
            quick(s, i + 1, r);
        }
    }

 public static void main(String[] args) {
        int[] array = new int[]{9, 6, 8, 7, 1, 100, 3, 2, 0, 14};
        quick(array, 0, array.length - 1);

        for (int i : array) {
            System.out.println(i);

        }
    }

博客参考

博客参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址 快速排序 原理 快速排序是C.R.A.Hoare提出的一种交换排序。它采用分治的策略,所以也称其为分治排...
    gyl_coder阅读 932评论 0 0
  • 版本记录 前言 将数据结构和算法比作计算机的基石毫不为过,追求程序的高效是每一个软件工程师的梦想。下面就是我对算法...
    刀客传奇阅读 5,242评论 4 72
  • 快速排序由于排序效率在同为O(NlogN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治...
    爱情小傻蛋阅读 1,175评论 0 9
  • 前言 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想--...
    fjytqiu阅读 2,270评论 0 3
  • “我们不只是用相机拍照, 我们带到摄影中去的, 是所有我们读过的书、 看过的电影、听过的音乐、 走过的路、爱过的人...
    王大雯雯子阅读 309评论 0 0