排序算法 - 快速排序

简介


同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和 交换位置来达到排序的目的。

不同的是,冒泡排序在每一轮中只把1个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆分成两个部分。

在这里插入图片描述
在这里插入图片描述
  • 紫色:基准元素
  • 绿色:比基准元素大的元素
  • 黄色:比基准元素小的元素

这种思路叫做分治法,假如给出如上图数组,一般情况下,使用冒泡排序需要比较七轮,每一轮把1个元素移动刀数列的一端,时间复杂度O(n^)。


基准元素的选择


基准元素,英文pivot ,在分治过程中,以基准元素位中心,把其他元素移动到它的两侧

  1. 一般情况下最简单的方式是选择数列的第一个元素
  2. 随机选择一个 元素作为基准元素,并且让基准元素和数列首元素交换位置


快速排序流程:


首先,选定基准元素 pivot ,并且设置 left 和 right 指针,指向左右两个元素

在这里插入图片描述

       

  • 第一次循环

        right 指针开始,让指向的元素和基准元素做比较。如果大于或等于基准元素,则指针向左移动,如果小于基准元素,则 right 停止移动。当前数列 7 > 5 向左移动,1 < 5 停止移动,切换 left 指针。

        left 指针开始,让指向的元素和基准元素做比较。如果小于或等于基准元素,则指针向右移动,如果大于基准元素,则 left 指针停止移动, 8 > 5 停止移动

        当 right 和 left 都停止后,让 left 和 right 指针所指向的元素交换位置

在这里插入图片描述
  • 第二次循环

        切换到 right 指针,向左移动 right 先移动到 2, 2 < 5 停止移动

        切换到 left 指针,向右移动 left 移动到6 ,6 > 5 停止移动

在这里插入图片描述
  • 第三次循环

        切换到 right 指针,向左移动 right 先移动到 9, 9 > 5 向左继续移动 right 移动到 3 ,3 < 5 停止移动

        切换到 left 指针,向右移动 left 移动到 3 ,和 right 重合,将 基准元素 5 和 重合元素 3 交换

在这里插入图片描述

到此第一轮“探测”真正结束。此时以基准数 5 为分界点,5 左边的数都小于等于5,5 右边的数都大于等于5 。


现在 基准元素 5 已经归位 , 此时我们以 5为分界点拆分成两个数列 ,左边的数列 [3,1,2] ,右边的数列 [9,6,8,7],接下来还需要分别处理这两个数列


左边序列 :
在这里插入图片描述
  • 第一轮循环

        从 right 指针开始,2 < 3 停止移动

        切换到 left 指针,1 < 3 继续向右移动,left 和 right 重合,交换元素

在这里插入图片描述

基准元素 3 已经归位,接下来需要处理 基准元素 3 左边的序列 [2,1]

在这里插入图片描述


右边序列 :


在这里插入图片描述

        从 right 指针开始,7 < 9 停止移动

        切换到 left 指针,6 < 9 继续向右移动,8 < 9 继续向右移动 与 right 指针重合,交换元素

在这里插入图片描述

基准元素 9 已经归位,接下来需要处理 基准元素 9 左边的序列 [7,6,8]

在这里插入图片描述
在这里插入图片描述

最后得到的序列如下:[1,2,3,5,6,7,8]

在分治法的思想下,原数列在每一轮都被拆分成两部分,每一部分在下一轮又分别被拆分成两部分,直到不可再分为止。

算法处理过程:

在这里插入图片描述

代码 :

/**
 * 快速排序
 */
public class demo3 {

    public static void main(String[] args) {
        int array[] = {5,8,6,3,9,2,1,7};
        quickSort(array,0,array.length-1);
        System.out.printf(Arrays.toString(array));
    }


    public static void quickSort(int[] arr,int startIndex,int endIndex){
        //递归结束
        if(startIndex >= endIndex){
            return;
        }
       //取第一个位置为基准元素
        int pivot = arr[startIndex];
        int left = startIndex;
        int right = endIndex;

        while (left != right){
            //控制right指针比较并且左移
            while (left < right && arr[right] > pivot){
                right--;
            }
            //控制left指针比较并且右移
            while (left < right && arr[left] <= pivot){
                left++;
            }
            if(left<right){
                int p = arr[left];
                arr[left] = arr[right];
                arr[right] = p;
            }

        }

        //pivot和指针重合点交换
        arr[startIndex] = arr[left];
        arr[left] = pivot;

        quickSort(arr,startIndex,right - 1);
        quickSort(arr,right + 1,endIndex);

    }


}

[1, 2, 3, 5, 6, 7, 8, 9]

个人博客地址:http://blog.yanxiaolong.cn | <font color = "orange"> 『纵有疾风起,人生不言弃』 </font>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 什么是快速排序? 摘自漫画算法: 同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的...
    花逝97阅读 723评论 0 1
  • 作为一个自己的复习记录,此处暂时只实现一个最简单的快排。关于快排更深入的探讨。参考本文末尾的链接。 基本思想:1,...
    _Zy阅读 200评论 0 0
  • 原理解析 快速排序使用分治法策略来把一个序列分为两个子序列。 步骤为: 从数列中挑出一个元素,称为“基准”, 重新...
    2b61575c37fd阅读 314评论 0 2
  • 来源于公众号:码农田小齐作者: 小齐本齐 (本文来自作者投稿) 快速排序算法 首先选一个基准 pivot,然后过一...
    码农小光阅读 718评论 1 9
  • 十大经典排序算法——系列文章 冒泡排序[http://www.ikeguang.com/?p=1447] 选择排序...
    大数据技术派阅读 439评论 0 2