数据结构与算法(8)-排序

目录
一.排序的基本概念与分类
    1.定义
    2.排序的稳定性
    3.内排序与外排序
二.冒泡排序
    1.冒泡排序的基本思想
    2.冒泡排序算法
    3.冒泡排序代码实现
    4.冒泡排序优化
    5.冒泡排序复杂度
三.简单选择排序
    1.简单选择排序算法
    2.简单选择排序复杂度分析
四.直接插入排序
    1.直接插入排序算法
    2.直接插入排序复杂度分析
五.希尔排序
    1.希尔排序原理
    2.希尔排序算法
    3.希尔排序复杂度分析
六.堆排序
    1.定义
    2.堆排序算法
    3.堆排序复杂度分析
七.归并排序:
    1.归并排序算法
    2.归并排序复杂度分析
    3.非递归实现归并排序
八.快速排序
    1.含义
    2.快速排序算法
    3.快速排序复杂度分析
    4.快速排序的优化
九.总结
    1.内排序分类
    2.排序算法复杂度
    3.从算法的简单性来看,我们将7种算法分为两类

一.排序的基本概念与分类

1.定义:

(1)排序:

假设含有n个记录的序列为{r1,r2,......,rn},其相应的关键字分别为{k1,k2,......,kn},需确定1,2,......,n的一种排列p1,p2,......,pn,使其相应的关键字满足kp1≤kp2≤......≤kpn(非递减或非递增)关系,即使得序列成为一个按关键字有序的序列{rp1,rp2,......,rpn},这样的操作就称为排序

2.排序的稳定性:

(1)假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j)。如果排序后ri仍领先于rj,则称所用的排序方法是稳定的;反之,若可能使得排序后的序列中rj领先ri,则称所用的排序方法是不稳定的

3.内排序与外排序

(1)内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中

(2)外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行

(3)对于内排序来说,排序算法的性能主要是受3个方面影响:

  • 时间性能:高效率的内排序算法应该是具有尽可能少的关键字比较次数和尽可能少的记录移动次数
  • 辅助空间:评价排序算法的另一个主要标准是执行算法所需要的辅助存储空间。辅助存储空间是除了存放待排序所占用的存储空间之外,执行算法所需要的其他存储空间
  • 算法的复杂性:这里指的是算法本身的复杂度,而不是指算法的时间复杂度

(4)内排序分为:插入排序、交换排序、选择排序和归并排序

排序

二.冒泡排序

1.冒泡排序的基本思想:

冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止

2.冒泡排序算法:

冒泡排序图解1
冒泡排序图解2

3.冒泡排序代码实现:

冒泡排序

4.冒泡排序优化

5.冒泡排序复杂度:

冒泡排序的时间复杂度为O(n2)。

三.简单选择排序

1.简单选择排序算法:

(1)定义:

简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n)个记录交换之

(2)代码实现:

2.简单选择排序复杂度分析:

(1)简单选择排序的“时间复杂度依然为O(n2)

(2)尽管与冒泡排序同为O(n2),但简单选择排序的性能上还是要略优于冒泡排序

四.直接插入排序

1.直接插入排序算法:

(1)定义:

直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表

(2)代码实现:
插入排序

2.直接插入排序复杂度分析

(1)直接插入排序法的时间复杂度为O(n2)

(2)同样的O(n2)时间复杂度,直接插入排序法比冒泡和简单选择排序的性能要好一些

五.希尔排序

1.希尔排序原理:

2.希尔排序算法:

3.希尔排序复杂度分析:

六.堆排序:

1.定义:

(1)堆排序(HeapSort),就是对简单选择排序进行的一种改进
(2)堆是具有下列性质的完全二叉树:
  • 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(如图所示);
  • 或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆

2.堆排序算法:

(1)堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法
(2)基本思想:

将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如此反复执行,便能得到一个有序序列了

(3)代码实现:

3.堆排序复杂度分析:

(1)堆排序的时间复杂度为O(nlogn)

七.归并排序:

1.归并排序算法:

(1)归并排序(Merging Sort)就是利用归并的思想实现的排序方法
(2)原理:

它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到|n/2|(|x|表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序

(3)代码实现:

2.归并排序复杂度分析:

(1)归并排序的算法复杂度为O(nlogn)
3.非递归实现归并排序:
(1)代码实现:
归并排序
(2)使用归并排序时,尽量考虑用非递归方法

八.快速排序:

1.含义:

(1)希尔排序相当于直接插入排序的升级,它们同属于插入排序类
(2)堆排序相当于简单选择排序的升级,它们同属于选择排序类。
(3)而快速排序其实就是冒泡排序的升级,它们都属于交换排序类

2.快速排序算法:

(1)基本思想:

通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的

(2)代码实现:
快速排序

3.快速排序复杂度分析:

(1)快速排序的算法复杂度为O(nlogn)

4.快速排序的优化

(1)优化选取枢轴
(2)优化不必要的交换
(3)优化小数组时的排序方案
(4)优化递归操作:

九.总结:

1.将内排序分为:插入排序、交换排序、选择排序和归并排序四类

排序分类

2.排序算法复杂度:

排序复杂度

3.从算法的简单性来看,我们将7种算法分为两类:

  • 简单算法:冒泡、简单选择、直接插入
  • 改进算法:希尔、堆、归并、快速

(1)从平均情况来看,显然最后3种改进算法要胜过希尔排序,并远远胜过前3种简单算法。

(2)从最好情况看,反而冒泡和直接插入排序要更胜一筹,也就是说,如果你的待排序序列总是基本有序,反而不应该考虑4种复杂的改进算法。

(3)从最坏情况看,堆排序与归并排序又强过快速排序以及其他简单排序

(4)从稳定性来看,归并排序独占鳌头,对于非常在乎排序稳定性的应用中,归并排序是个好算法

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

推荐阅读更多精彩内容