排序算法

1 冒泡排序

如果是对n个数升序排序,冒泡排序每趟排序把一个最大值浮到最后。

第一趟,针对n个数,比较第1个数和第2个数,如果1数比2数大,交换两数位置,然后比较第2个位置的数和第3个位置的数,大数放后边,一直比较到第n-1个数和第n个数,完成一趟排序,这趟排序,将n个数中的max移动到了第n个位置;

第二趟,针对前n-1个数,挪动这n-1个数中的max到第n-1个位置;

第i趟,针对前n-i+1个数,挪动max到第n-i+1个位置;

n个数最多需要n-1趟,完成排序。

两层for循环可以搞定。

但是这样的方法不是最优,如果某一趟排序过程中,已经没有数发生交换,就是说其实这n个数已经有序了,他还会继续进行剩下的扫描,其实剩下的扫描都是浪费,对于这种情况的一个改进办法就是设置一个flag标志,开始的时候置0,如果排序过程中发生了数据交换,flag置1,每趟结束如果发现flag为0,就可以结束整个排序过程,提高效率。

2 快速排序

如果是对n个数升序排序,快速排序通过选择一个基准,每趟排序把小于基准的放基准左边,大于基准的放基准右边,基准值放中间。

可以选择最后一个元素(最右)作为基准,右指针左移找小于基准的数,找到后与左指针当前指向的数进行交换(相当于挪到左边),右指针停住;左指针开始右移,找大数,与右指针当前指向的数进行交换,左指针停住;重复直到左右指针相遇,将基准值赋给左指针(或者右指针,两人相遇,指向的位置都是相同的)。完成一趟排序。

递归调用快速排序,对基准左边的区间和基准右边的区间分别进行排序。

基准的选择直接影响排序算法的性能,如果每趟排序都将大部分的元素划分到基准一侧,那么快排退化成冒泡,递归调用栈的深度也特别深,为了避免这种情况,可以采用三者取中的办法,从首元素,尾元素,中间元素中取中值作为本趟排序的基准元素。每趟排序前将选取的基准元素与序列中的最右元素交换位置,即可按照上面的算法进行排序。

3 堆排序

对n个元素进行升序排序:

将n个元素构成一个大顶堆;

交换堆的第一个元素和堆的最后一个元素的位置;

将移走最大值元素后的剩下的这些元素构成的序列重新转换成一个堆;

重复这个过程n-1次就可以实现n个元素的升序排列。

调整为大顶堆的步骤:从堆顶元素、左节点、右节点中选择最大值作为堆顶元素,递归实现对所有子树的调整。

建堆的步骤:从数组的一半位置开始,调用调整大顶堆的函数,不断往上建堆。

4 希尔排序

缩小增量排序,将整个待排序的序列划分成若干子序列,分别对子序列进行排序,然后逐步缩小划分子序列的间隔,重复上述操作,直到划分间隔变为1。

排序算法的时间主要消耗在排序时元素的移动上,采用希尔排序,最初间隔的取值较大,因此排序时,元素移动的跨度大,当间隔等于1的时候,序列已经基本有序了,所以不需要特别多的移动就可以完成排序。

间隔的选取方法,序列总长度的一半,后续间隔为前一趟间隔的一半。

5 简单选择排序

从未排序的里面选一个最小值放未排序的最开头,未排序的序列长度减一。

每一趟的选择排序都是从序列里面未排好顺序的元素中选择一个最小元素,如果最小元素不位于未排序子序列的第一个位置,将该元素与第一个元素交换位置。

6 直接插入排序

从无序序列里面拿出一个值,插入到前面已经有序的序列中,让有序序列仍然有序。

有序序列长度变大,无序序列长度缩小。

7 归并排序

分解:计算分裂点,将当前序列一分为二

求解:递归地对两个子区间归并排序,当区间里只有一个元素的时候返回

组合:将已排序的两个子区间归并为一个有序区间

8 性能比较

名称 稳定性 时间复杂度 空间复杂度
冒泡排序 稳定 O(n2) O(1)
选择排序 不稳定 O(n2) O(1)
插入排序 稳定 O(n2) O(1)
快速排序 不稳定 O(nlogn) badO(n2) O(logn)
堆排序 不稳定 O(nlogn) O(1)
归并排序 稳定 O(nlogn) 有争议
希尔排序 不稳定 O(nlogn*logn) badO(n2) O(1)
计数排序 稳定 O(n+m) O(n+m)
桶排序 稳定 O(n) O(m)
基数排序 稳定 O(k*n) badO(n2) -

归并排序适合子序列有序的序列排序;快速排序不适合基本有序的序列排序。

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

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,164评论 0 52
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    printf200阅读 760评论 0 0
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    闲云清烟阅读 756评论 0 6
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    zwb_jianshu阅读 1,105评论 0 0
  • 从敬老院出来回家了一趟,老妈不小心摔了腰,索幸没太大意外,照顾几天后又匆匆忙忙赶到学校,汇报敬老院志愿服务的活动内...
    终究成为过去阅读 209评论 0 0