2018-04-09 快速排序

快速排序传说中很imba的一种排序。

快速排序大概步骤是三部曲
第一部:选主源
第二部:子集划分
第三部:算法实现
这三部曲讲的就是,假设你有个数组之类的数据源。


OT@1GRU92Z{KV%_$2JP}PR8.png

就想上图中左边这样,一个无序的数据源,那先要选出一个锚点,或者叫pivot,然后像上图中右边这样,以锚点为中心,比锚点大的放左边儿,比锚点小的放右边儿。这样就完成了第一轮儿快排。
那么先来讲下第一部的故事。
讲的就是这个锚点啊就是pivot选择实际上至关重要,一般就是取三个数,数据源头,尾,和中间的数,然后比较一番。给三个人先做个简单的排序,从小到大那样,如图

快排—选主源.png

这里的伪码描述的就是一个选择pivot的过程,就是三个if把三个数进行从左到右,从大到小的排序,并且放回到数据源中。这个swap就是交换的意思。
他这个最后一步要解释下,我在别人的算法中没怎么看过这么做,不过浙大这个课程还是很科学的,他的意思就是你可以直接把数据源中下标为0,Length-1,Length-2这三个位置先忽略了,为啥呢,因为这仨位置实际上就是刚刚选主源挑出来的数,然后最后一步的交换也是把pviot本应该再数据源中间位置的数,交换到倒数第二位,为了让后面写快排代码时候,循环不必还要特意跳过中间位置。


快排—循环说明.png

这张图说明的就是一个快排算法里循环到底在干啥,可以看到最右面红色的6就是找好的pivot并且已经交换到数据源倒数第二个位置,这样设置两个下标,i和j,分别从左向右,还有从右向左扫描,i意味着第一张图的左边,j意味着第一张图里的右边。
这样每一次循环i和j分别和pivot比较一番,如果i位置的数比pivot大,先标记好暂停i的移动,看下j,j也要和pivot比较。如果比pivot大j继续移动,直到j碰到一个数比pivot小,那么说明j和i的数是需要调换下。以此类推,完成一轮快排。
最后就是递归的调用整个快排的过程。毕竟我们看第一张图可以看到,一轮儿快排做完也只是很粗略的排序,第一张图左边的数据还是不顺序的,所以每次递归就相当于重新挑选个pivot,只不过当量选择在左边儿那个堆数据里就可以。
下面是浙大课程里的伪码


快排—伪码.png

在网上看到一个老哥写的java快排,写的很不错

/**
 * 一次快速排序
 * @param array 数组
 * @param lo 数组的前下标
 * @param hi 数组的后下标
 * @return key的下标index,也就是分片的间        隔点
 */
public static int partition(int []array,int lo,int hi){
/** 固定的切分方式 */
int key=array[lo];//选取了基准点
while(lo<hi){
    //从后半部分向前扫描
    while(array[hi]>=key&&hi>lo){
        hi--;
    }
    array[lo]=array[hi];
    //从前半部分向后扫描
    while(array[lo]<=key&&hi>lo){
        lo++;
    }
    array[hi]=array[lo];
}
array[hi]=key;//最后把基准存入
return hi;
}

/**
 * 快速排序
 * @param array
 * @param lo
 * @param hi
 */
public static void quickSort(int[] array,int lo ,int hi){
if(lo>=hi){
    return ;
}
//进行第一轮排序获取分割点
int index=partition(array,lo,hi);
//排序前半部分
quickSort(array, lo, index - 1);
//排序后半部分
quickSort(array,index+1,hi);
}

//测试函数
public static void main(String[] args) {
int[] arr = {1,9,3,12,7,8,3,4,65,22};

quickSort(arr, 0, arr.length-1);

for(int i:arr){
    System.out.print(i+",");
}

}

 //三数取中
//下面的两步保证了array[hi]是最大的;
int mid=lo+(hi-lo)/2;
if(array[mid]>array[hi]){
  swap(array[mid],array[hi]);
}
if(array[lo]>array[hi]){
  swap(array[lo],array[hi]);
}

//接下来只用比较array[lo]和array[mid],让较小的在array[lo]位置就OK。
if(array[mid]>array[lo]){
  swap(array[mid],array[lo]);
}
int key=array[lo];

这个老哥的取pivot里就没有把pivot放最后,而是创建了变量key

最后浙大这个课程老师说快排还是适合大数据量,比如数据源大于几百以上,毕竟是递归的,还是挺吃内存。

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

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,170评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,245评论 0 2
  • quicksort可以说是应用最广泛的排序算法之一,它的基本思想是分治法,选择一个pivot(中轴点),将小于pi...
    黎景阳阅读 445评论 0 1
  • 今天妈妈说有我的快递,打开一看是之前支持Taylor Swift众筹的T恤和CD,期盼了很久终于收到了! 我想如果...
    Rebecca小零阅读 118评论 1 0
  • 01 清风吹过湖面,我看到了你 清澈的眼眸,明媚的笑容 你在我的记忆里长存 挥不掉 洒不落 那里的墙破了 风一吹,...
    追逐繁星的猫阅读 751评论 0 1