排序算法(4)

姗姗来迟的排序算法的第四篇,本介绍归并排序算法,是不是有人会问这样的问题,现在书本上学习到的排序算法都太经典了,在实际生产环境中基本上不会直接拿来使用,如果你的上司让你实现一个归并或者快排在生成环境中使用,那他一定是疯了,基于此,我介绍一种在归并排序算法基础上改进而来的Timsort算法,后者是在实际排序中经常用到的排序算法,与之详情,请往下看。

归并排序

归并排序的核心思想就是,将一个排序数组不断的划分,划分到足够的小的粒度,那就是长度为1了,然后开始1/1合并为2,然后再2/2合并为4,依次类推,在合并的过程中,让数据有序,最后完成排序。


2.png

代码如下:

public static void sort(int[] nums, int start, int end) {
    Arrays.nonBlank(nums);
    if (start >= end) return;
    int mid = (start + end) / 2;
    sort(nums, start, mid);
    sort(nums, mid + 1, end);
    merge(nums, start, mid, end);
}

private static void merge(int[] nums, int start, int mid, int end) {
    int[] temp = new int[end - start + 1];
    int k = 0;
    int i = start;
    int j = mid + 1;
    while (i <= mid && j <= end) {
        if (nums[i] <= nums[j]) temp[k++] = nums[i++];
        else temp[k++] = nums[j++];
    }
    while (i <= mid) temp[k++] = nums[i++];
    while (j <= end) temp[k++] = nums[j++];
    for (int l = 0; l < temp.length; l++) {
        nums[start + l] = temp[l];
    }
}

归并算法的主要方法还是分治法,然后合并分开的元素,直至最后有序,最好/最坏时间复杂度为O(nlgn),毋庸置疑,归并排序是稳定的排序,为什么有序,因为它没有跳跃,所以是有序的。

归并的时间复杂度提升了很多,那问题来了,归并排序有没有不足?是存在的,首先很容易想到的一个特例就是如果一个数组是有序的,那排定有序数组的时间复杂度也是O(nlgn),而如果用我们之前介绍的冒泡的改进算法只需要O(n)就搞定了,那下面分析一下如何改进归并排序算法。

已经看过归并排序的实现,会发现其实所有的工作都是在合并(merge)的过程当中完成的。所以归并的优化也就是对合并过程的优化,以下三点可能的优化途径:

1、能否使合并过程运行的更快?
2、能否执行更少的合并过程?
3、是否存在一些与其使用归并排序不如使用其他排序的情况?

基于以上三个问题,思考十分钟(这十分钟估计也想不出个啥),开始介绍下一种TimSort的自适应归并排序算法;

自适应归并排序算法——TimSort

TimSort算法基于归并算法改进而来的算法,其主要改进是:

  1. 在应用归并排序时,会寻找数组中的自增分区或者自减分区,已分区为合并的基础长度,而不是将其划分单个的元素;
  2. 针对自减分区直接进行翻转而不是直接合并,自减分区识别中必须严格降序,要不然无法保证算法的稳定性;
  3. 在分区合并时,采用二分插入算法,即使用二分查找找到数据插入的位置,然后插入;
  4. 当部分分区(TimSort中把分区成为run)长度小于分区最小长度时,从数组中选择合适的长度插入;
  5. 当数组的长度小于某一特定值时,其直接采用插入排序来排序
  6. 算法采用栈来存放有序分区,其合并时机要符合一定规则,假设从栈顶到栈底,分别有x/y/z三个元素(分区),当x>y+z && y>z时,合并结束,否则进行合并操作;
  7. 合并过程中,采用二分插入算法提高效率;

基于以上所有的改进策略,TimSort排序算法诞生,其使用场景是序列连续部分有序,当然其最坏的表现也不过就是普通归并,不能比这个更坏了,其最好时间复杂度O(n),其平均/最坏时间复杂度O(nlgn),并且该算法为稳定排序。具体实现参见 java1.7+版本中的Arrays.sort方法,另外python中的排序算法也是这个。

总结

归并算法其时间复杂度很稳定,其最好/平均/最坏时间复杂度是一样,这样给出了改进的空间,映射到生活中好像也是如此,我们也得根据某些特殊情况去制定一些特殊的规则,必须不是所有的人都想走大路,有时候符合条件的小路也未尝不是一种很好的选择。

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

推荐阅读更多精彩内容

  • 本文首发于我的个人博客:尾尾部落 排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法...
    繁著阅读 4,572评论 3 119
  • 一. 写在前面 要学习算法,“排序”是一个回避不了的重要话题,在分析完并查集算法和常用数据结构之后,今天我们终于可...
    Leesper阅读 2,528评论 0 40
  • 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是直接插入排...
    Jack_deng阅读 477评论 0 0
  • 自青岛一别,羞涩妹联系我渐多,越来越不羞涩了。 羞涩妹,94年青岛人,大学在南京,父母老师眼中的好孩子,同学朋友眼...
    九戊阅读 212评论 0 0
  • 江湖打拼许多年 梦房梦车终是梦 自从相识薇知音 天天歌声响不停
    龙港娱乐传媒阅读 72评论 0 0