排序算法之快速排序

package com.wang.sort;

/**
 * 快速排序
 * 思路:为每一个基数通过分治思想找到合理位置
 * 
 * @author wxe
 * @since 0.0.1
 */
public class QuickSort {
    public static void quickSort(int[] arr, int low, int high) {
        int i, j, temp, t;
        if (low > high) {
            return;
        }
        i = low;
        j = high;
        // temp就是基准位
        temp = arr[low];
        System.out.println("我是基准:"+temp);

        while (i < j) {
            // 先看右边,依次往左递减
            while (temp <= arr[j] && i < j) {
                j--;
            }
            // 再看左边,依次往右递增
            while (temp >= arr[i] && i < j) {
                i++;
            }
            // 如果满足条件则交换
            if (i < j) {
                t = arr[j];
                arr[j] = arr[i];
                arr[i] = t;
            }

        }
        // 最后将基准为与i和j相等位置的数字交换
        arr[low] = arr[i];
        arr[i] = temp;
        
        // 递归调用左半数组
        quickSort(arr, low, j - 1);
        // 递归调用右半数组
        quickSort(arr, j + 1, high);
    }

    public static void main(String[] args) {
        int[] arr = {6,1,2,7,9,3,4,5,10,8};
        System.out.println("开始");
        quickSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+",");
        }
    }

}


我们来分析一下基本的思路:


基准数为6.png
  • 第一次交换:以6为基准,首先j向前移动,直到遇见比这个基准6小的第一个数为止,然后i向后移动,直到遇见比这个基准数6大的第一个数为止。如图所示:


    基准数为6.png

    现在我们知道j指向数字5,i指向数字7,我们将这两个数字进行交换,如图所示:


    基准数为6.png

    第一次交换结束了,首先仍然是j向前移动,直到遇见比这个基准6小的第一个数为止,然后i向后移动,直到遇见比这个基准数6大的第一个数为止。如图所示:
    基准数为6.png

    现在我们知道j指向数字4,i指向数字9,将两个数字进行交换,如图所示:


    图片.png

    第二次交换结束了,首先仍然是j向前移动,直到遇见比这个基准6小的第一个数为止,然后i向后移动,直到遇见比这个基准数6大的第一个数为止。如图所示:
    基准数为6.png

    当j向前移动遇到3停止了,i向后移动也遇到3了,说明i,j相遇了,没有必要再走下去了,这个时候,该是给基数找到了一个新的位置。将基准数与该数进行交换,该数成为新的基准数,而原来的基准数也找到了合适的位置,如图所示:
    基准数为6.png

    到此为止,第一个基准数找到了合适的位置,此时,我们就需要根据原来的基准数6将数分为两类了,基准数6的数字都是比6小,而基准数6右边的数都是比6大。此时我们需要再以这个基准数为分解将数据分为两部分,并分别对这两部分进行以上步骤的基准数分类。现在我们知道,基准数6分类后的两类数分别为:左边为3,1,2,5,4.右边为9,7,10,8。
  • 接下来我们将通过以上步骤对左边数据为基准数找位置。


    基准数为3.png

    左边数据第一次交换:以3位基准数,首先仍然是j向前移动,直到遇见比这个基准3小的第一个数为止,然后i向后移动,直到遇见比这个基准数3大的第一个数为止。如图所示:


    图片.png

    当j遇到数字2时停止,然后i开始移动遇到2发现i,j又相遇了,没有必要再走下去了。这个时候,相当于说明给基准数3找到了合适的位置了。进行交换如图所示:
    基准数为3.png

    到此为止第二个基准数找到了合适的位置。此时,我们根据基准数3将数据分为两类,左边为2,1,右边为5,4。记下来对这两部分进行以上步骤的基准数分类。

  • 接下来我们将通过以上步骤对左边数据为基准数找位置。


    基准数为2.png

    左边数据进行交换:以2位基准数,首先仍然是j向前移动,直到遇见比这个基准2小的第一个数为止,然后i向后移动,直到遇见比这个基准数2大的第一个数为止。


    图片.png

    现在只剩下两个数,如果j向前移动,没有比2小的数了,只有1,所以j保持不动,i向后移动,在数字1处相遇,此时就为基数2找到了合适的位置,同时也找到了新的基数1.两者进行交换,如图所示:
    基准数为2.png
  • 现在新的基准数为1,只剩下一个数,没有必要再进行任何处理了。如图所示:


    基准数为1.png
  • 接下来我们看看之前3右边数的分类。新的基数为5如图所示:


    基准数为5.png
  • 现在又找到了新的基准数4,只有一个数字了,没有必要进行任何处理了。


    基准数为4.png

到此为止,我们把最开始基准数为6左边分类所有的数字的基准数都找到了合适的位置.

  • 现在来处理基准数6右边的分类数字,如图所示:


    基准数为9.png

    第一次交换:j向前移动找到第一个小于基准数9的位置即停止,i向前移动,找到第一个大于基准数9的位置即停止,如图所示:


    图片.png

    j找到8的时候停止,i指向数字10的时候停止,进行交换,如图所示:
    基准数为9.png

    第一次交换结束了,j继续向前走,找到8比技术9小,i继续向后走,正好在数字8出相遇,没有必要再走下去了,说明已经为基准数9找到了合适的位置,同时也找打了新的基准数8,两者进行交换,如图所示:


    基准数为9.png

    现在原来的基准数又把数据分为两部分了,左边为8,7。右边为10。
  • 我们先来为左边的数据进行基准数8找合适位置。


    基准数为8.png

    j找到的第一个小于基准数8的位置,然后接着i向后移动寻找第一个大于基准数8的位置,正好在数字7相遇,没有必要再走下去,说明为基准数8找到了合适位置,也找打了新的基准数7.两者进行交换,如图所示:


    基准数为8.png

    到此为止,我们原来的基准数8将数据分类好了。
  • 左边只剩下7,也就是新的基准数,只有一个数字,不需要进行任何处理了。如图所示:


    基准数为7.png
  • 再来看看基准数9右边的数据,只剩下数字10也是。如图所示:
    基准数为10.png

    只剩下一个数字,也是新的基准数10,不需要任何处理了。
    到此为止,我们通过快速排序的方法将数字排好序了,如图所示:
    图片.png

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

推荐阅读更多精彩内容

  • 采用分治的思想,首先选取一个基准值pivot,然后将小于基准值的数放到左边,大于基准值的数放到右边。而对于左边的部...
    哇哇哇one阅读 428评论 0 1
  • 算法思想 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再...
    木子小三金阅读 156评论 0 0
  • 1.选择数组中的一个元素 2.进行一次Partition,将数组分为小于该元素和大于该元素的两个部分 3.分别在两...
    Nostalgia1024阅读 1,164评论 0 1
  • 在平均状况下,排序n个元素要O(nlogn)次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。事实...
    BEYOND黄阅读 272评论 0 2
  • 刚看到一则新闻: “2017年2月9日早上8时许,陕西一公车上少年大声指认车上小偷组织,却反遭对方一行...
    沧海涤尘阅读 346评论 0 4