算法---一种简单的思路理解快速排序(附源码)

前言

说起快速排序,可能是一个很基础的排序了,不管是不是第一次听到这个词,还是听过但是没有试过,或者没有理
解过。都希望今天你读完这篇文章能够加深理解。不懂的话希望你能懂,懂了的话希望你能多一种思路来理解。

思路

有一个数组,里面的数字分别是{3, 9, 4, 2, 5, 8, 7, 6, 1},然后请你用快速排序实现把数组从小到大的顺序排列好。
我用图的方法演示来看,更便于理解。

如下:

<img src="http://martinhan.site/images/list1.jpeg" width="568" height="42">

下面开始讲思路了:
我们先找最中间的5,把它固定住,也可以理解为以5为基准。
然后我们在剩下的8个数字里面把比5小的放到5左面。
然后把比5大的放到5的右面。

首先我们从前往后看,用一个箭头表示我们程序当前走到了哪个位置
第一步:a箭头指向第一个数字,第一个数字是3,3 < 5,所以3其实不用动。
第二步:a箭头指向了第二个数字,第二个数字是9,9 > 5,所以9其实应该是放到5的右边的。

那么问题来了,9这个数字放到5的右边,具体要放到第几位的?

<img src="http://martinhan.site/images/list2.jpeg" width="568" height="176">

这个时候,我们要是从5的右边找一个比5小的,然后和刚刚的那个数字调换,是不是就正好可以了。
那我们从右侧开始找,
第一步:b箭头指向第一个数字,右侧第一个数字是1,1 < 5,所以1应该放到5的左边。

想想刚刚我们从左边找到了9,右边找到了1,然后将他俩互换,如下

<img src="http://martinhan.site/images/list3.jpeg" width="568" height="107">

结果如下

<img src="http://martinhan.site/images/list4.jpeg" width="568" height="170">

上面这个a和b是我们刚刚说的,我们两个箭头指向的位置,然后这次我们继续从左侧找一个比5大的数字停下

第一步:a箭头指向了4,4 < 5,所以4不用动,箭头指向下一个位置
第二步:a箭头指向了2,2 < 5,所以2不用动,箭头指向下一个位置
第三步:a箭头指向了5,5 = 5, 所以箭头指到5的时候需要等一等,此时此刻,虽然5的左边肯定都小于5了,可是5右边的数字万一要是还有小于5的呢,5还是需要往右移动的
第四步:b箭头当前指向6,6 > 5,所以6不用动,箭头指向前一个位置
第五步:b箭头指向了7,7 > 5,所以7不用动,箭头指向前一个位置
第六部:b箭头指向了8,8 > 5,所以8不用动,箭头指向前一个位置

经过了上面的一系列操作,我们得到了如下的数组。

<img src="http://martinhan.site/images/list5.jpeg" width="568" height="161">

a和b现在都指向了我们这个基准的数字5。
现在我们这么想,已经把比5小的都排列到了5的左边,比5大的都排列到了5的右边。
现在我们把数组堪称两部分,
左半部分:3 1 4 2
右半部分:8 7 6 9
我们依次类推:
根据刚刚的规则,我们把上面的一系列操作再分别排序左半部分和右半部分。
然后用我们刚刚所使用的规则再进行排序。

其实这就是大概快速排序的思路了。

标准思路

说完了我写一下标准思路。其实称之为标准思路,原因就是书本上大概都讲的这个,好多老师也上来就讲的这个。
还以3 1 4 2 5 8 7 6 9为例,我们开始做的是以5为基准,其实标准思路就是以1为基准的了。

源码下载

下载地址

本文所讲的思路是源码中的QuickSortMiddleBase方法
标准思路是QuickSort方法,

为了方便大家阅读,我把方法贴到下面

本文说的思路

void QuickSortMiddleBase(int array[], int begin, int end) {
    if(begin >= end) {
        return ;
    }
    int base_pos = (begin + end) / 2;
    int base_value = array[base_pos];

    int left_pos = begin, right_pos = end;
    int temp_val;

    while(left_pos != right_pos) {
        while(array[left_pos] < base_value && left_pos <= right_pos) {
            left_pos++;
        }
        while(array[right_pos] > base_value && right_pos >= left_pos) {
            right_pos--;
        }
        if(left_pos <= right_pos) {
            temp_val = array[left_pos];
            array[left_pos] = array[right_pos];
            array[right_pos] = temp_val;
        }
    }
    array[left_pos] = base_value;
    PrintArray(array, 9);
    QuickSortMiddleBase(array, begin, left_pos - 1);
    QuickSortMiddleBase(array, left_pos + 1, end);
}

标准思路

void QuickSort(int array[], int begin, int end) {
    if(begin >= end) {
        return ;
    }
    int base_pos = begin;
    int base_value = array[base_pos];

    int left_pos = begin, right_pos = end;
    int temp_val;
    while(left_pos != right_pos) {
        while(array[left_pos] < base_value && left_pos < right_pos) {
            left_pos++;
        }
        while(array[right_pos] > base_value && left_pos < right_pos) {
            right_pos--;
        }
        if(left_pos < right_pos) {
            temp_val = array[left_pos];
            array[left_pos] = array[right_pos];
            array[right_pos] = temp_val;
        }
    }
    //array[left_pos] = base_value;
    //array[base_pos] = temp_val;
    printf("sort result:");
    PrintArray(array, 9);
    QuickSort(array, begin, left_pos);
    QuickSort(array, left_pos + 1, end);

}

写在最后

克服懒惰,争取从一个看心情更的博主,做一个周更的博主~

关于我

个人网站:MartinHan的小站

博客:hanhan12312的专栏

知乎:MartinHan01

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

推荐阅读更多精彩内容

  • 作者:大海里的太阳原文地址:http://www.cnblogs.com/wxisme/ 前言 查找和排序算法是算...
    IT程序狮阅读 2,498评论 0 63
  • 前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中...
    宝塔山上的猫阅读 1,086评论 1 21
  • 搞懂基本排序算法 上篇文章写了关于 Java 内部类的基本知识,感兴趣的朋友可以去看一下:搞懂 JAVA 内部类;...
    醒着的码者阅读 1,189评论 3 4
  • http://192.168.1.2:8080/xss3/xss/examplr7.php?name=' ;ale...
    糖no1阅读 257评论 0 0
  • 祭蓝是一种宝石质釉。釉色鲜艳透明,肥厚莹润。明代称之为宝石蓝,产品很少,至清代的康熙、雍正、乾隆时期,祭蓝有了...
    吾吾斋阅读 1,513评论 0 0