排序好多问

  1. 基于比较的排序的下界是什么。

排序是为了一组数按从大到小(或从小到大)的顺序进行排列,也就是说它要在所有的排列中选择一种排列,而所有的排列的总数有n!种,而我们通过比较去排序,从这个层面上来看就是排除n!-1种顺序的可能性。假设待排序的数有ABCD...,对于一次比较 假设 A > B, 那么A必然就在B的前面,所有能够排除n!/2 种可能的顺序,依次类推至少需要log2(n!)(小于nlogn,这两者同等规模就不证明了哈)比较。

  1. 快速排序的有什么问题,如何改进的?

快排的思想很简单,一个典型的分而治之的思想,根据某个pivot(轴,基准值),将数组分为比它大和比它小的二部分,然后对这两部分分别排序。对于这样的算法描述,实现过程种应该注意些什么呢?

首先pivot的选择非常重要,因为如果每次都选择了一个最大数,那意味着需要做n(数组长度)次划分,时间复杂度就退化到n^2。因此就会有一些选自己策略,比如随机在数组种选择一个pivot,或者取头中末三个数,挑其中中等大小的数作为pivot。

然后选择了pivot,怎么把数组分成两部分呢,最简单的思想无非是搞二个缓存区A,B,然后顺序扫描数组,大的放A,小的放B,然后再写回数组,但这样引入了O(N)的空间复杂度。于是乎问题来了,怎么原地划分呢(这些个思路很容易被应用到一些算法题中https://leetcode.com/problems/remove-duplicates-from-sorted-array/)?

第一种思路 单向扫描的方式

showcode吧,感觉说起来好麻烦。


image
 while(j <= end){
            if(A[j] <= pivot){
                i++;
                Swap(A, i, j);
                j++;//j继续向前,扫描下一个
            }else{
                j++;//大于pivot的元素增加一个
            }
        }

它的不足地方在于只要遇上小于等于的数据就要做一次swap,所以改进的方法就有双端扫描的方式:

 while(i < j){
     while(i < j && A[j] > pivot){
                j--;
     }

      A[i] = A[j];
     while(i < j && A[i] <= pivot){
            i++;
     }            
     A[j] = A[i];
 }

以及后面还有什么把=情况也给划分出来,以及考虑选取两个pivot等等。


image
  1. 堆排序好像不怎么受欢迎,这是为嘛呢?

看到一种解释是CPU不友好,因为像其他的排序算法,数据的读取顺序其实大部分时候都是顺序的,而对于基于数组堆排序而言,nums[i] 要和nums[2i+1] nums[2i+2]进行比较,这个下标的跨度可能就很大了,这样就不利于CPU缓存了,因为违反了缓存基于局部性的原理。

  1. timsort是什么神奇的的排序算法

算法的思想不做过多介绍,核心就是利用了计算数据中的有序段,并适时合并的思路,但讲真挺佩服实现的人的,排序感觉是一个研究烂了的领域,竟然还有人在如此基础的领域做出这种进步,不容易呀,不像那些成天趁深度学习热度,各种发水文的人(酸溜溜的,我有羡慕成分,哈哈),膜拜大佬Tim Peters。

  1. 基数排序,桶排序,计数排序什么情况下适用呢

对于这些个线性排序,我首先树立的观点是,一旦一个算法能够比处理同类算法要快上一个量级,却没有带来其他方面的复杂度,那基本上是对问题做了特殊的假设,不适宜通用场景。而对于这些个线性排序方法,计数排序是要求数据可能的值的个数是比较少的是可以确定的。桶排序相当于是计数排序的一个泛化版本了,核心思想都是将数据在线性时间内划分到各个区间,区间之间的顺序是已知的,SO只要关注于区间里的排序,只要每个区间里的数据量够小,那么就能保证全体排序的线性时间,但其实也是对数据分布做了假设,如果数据可能的值域特别宽广,那桶太多了,必然从时间空间上看都是不合适的。而基数排序对数据的要求在于它是定长的(可以预处理成定长),而且不能太长,然后通过每一位它的取值是很少的,所以可以通过计数桶排序的方式搞定。所以它对数据的假设是,选定一个基后,数据位数不能太大。

  1. 冒泡 插入排序 选择排序这种时间复杂度n^2的算法肿么会有人用它呢?

每种算法都会有它的适用场景,就算时间复杂度高,这也显示的渐进的趋势,也就是说数据量大用它衡量才是OK的,如果只有几百个,那么时间复杂度某种程度上就失去了意义,或者说哪些复杂度里的被忽略的常数级别的,以及复杂度的系数的作用就会体现出来,这也是java中再数据量小的时候就直接采用插入排序搞起来的原因了(冒泡选择啥的好像真没啥好的啦啦啦)。

  1. 一个工业级的排序算法是肿么样的?

一个工业级别的排序算法往往是各种算法的组合,在什么什么场景下用特定的算法,数据少的时候可以用二分插入,多的时候用快排,或者timsort等等。其实其他方面也一样,每一种算法从论文里长出来,都是针对它要解决的哪个问题点的,所以很难一招打遍天下无敌手。

参考
https://blog.csdn.net/Holmofy/article/details/71168530

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

推荐阅读更多精彩内容