SlideShare a Scribd company logo
1 of 29
十种常用的排序方法
1. 冒泡排序(不是最佳算法)
2. 选择排序(偶尔是最佳算法)
3. 插入排序(不是最佳算法)
4. SHELL 排序(非最佳算法)
5. 归并排序(有时是最佳算法)
6. 快速排序(有时是最佳算法)
7. 堆排序(不是最佳算法)
8. 拓扑排序
9. 锦标赛排序
10. 基数排序(最佳算法)
一. 冒泡排序
1. 概念
  依次比较相邻的两个数,将小数放在前面,大数放在后
  面。
2. 实例:
   假设要排序的数组是:[49, 38, 65, 97,76, 13,27]
  第一步:[38, 49, 65, 76, 13, 27, 97]
  第二步:[38, 49, 65, 13, 27, 76, 97]
  第三步:[38, 49, 13, 27, 65, 76, 97]
  第四步:[38, 13, 27, 49, 65, 76, 97]
  第五步:[13, 27, 38, 49, 65, 76, 97]
  第六步:[13, 27, 38, 49, 65, 76, 97]
冒泡排序性能分析

1. 冒泡排序的复杂度
   若记录序列的初始状态为"正序",则冒泡排序过程
   只需进行一趟排序,在排序过程中只需进行n-1次比
   较,且不移动记录;反之,若记录序列的初始状态
   为"逆序",则需进行n(n-1)/2次比较和记录移动。
   因此冒泡排序总的时间复杂度为O(n*n)。
2. 冒泡排序是稳定性的算法
     不稳定的算法与稳定的算法在某些条件下可以
     转化。
    如果Ai = Aj, Ai原来在Aj前,排序后Ai还是要在Aj
     位置前,那这个算法就是稳定的
3. 优化后的名称:鸡尾酒排序,梳排序(Comb sort)
冒泡排序问题

请给下面数组用冒泡排序方法排序
[100, 27, 93, 87, 128, 40, 29, 18, 2, 2]
二. 选择排序
1.  概念
    每一趟从待排序的数据元素中选出最小(或最大)的一
    个元素,顺序放在已排好序的数列的最后,直到全部待
    排序的数据元素排完。常见的选择排序细分为简单选择
    排序、树形选择排序(锦标赛排序)、堆排序
2. 举例
   初始关键字 [49 38 65 97 76 13 27 49]
   第一趟排序后 13 [38 65 97 76 49 27 49]
   第二趟排序后 13 27 [65 97 76 49 38 49]
   第三趟排序后 13 27 38 [97 76 49 65 49]
   第四趟排序后 13 27 38 49 [76 97 65 49 ]
   第五趟排序后 13 27 38 49 49 [97 65 76]
   第六趟排序后 13 27 38 49 49 65 [97 76]
   第七趟排序后 13 27 38 49 49 65 76 [97]
选择排序性能分析

1. 复杂度
   比较次数与关键字的初始状态无关,总的比
   较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。 交换次
   数O(n),最好情况是,已经有序,交换0次;最
   坏情况是,逆序,交换n-1次。 交换次数比冒
   泡排序少多了,由于交换所需CPU时间比比
   较所需的CPU时间多,n值较小时,选择排序
   比冒泡排序快。复杂度O(n^2)
2. 选择排序是不稳定的排序方法,比喻:
   [5 8 5 2 9]
选择排序问题

请用选择排序方法为下面数组排序
[100, 27, 93, 87, 128, 40, 29, 18, 2, 2]
三. 插入排序
1. 概念
   将数列分为已有序和无序两个部分,每次将无
   序数列的第一个元素与有序数列的元素从后往
   前逐个进行比较,找出插入位置。
2. 举例
   初始关键字 [49 38 65 97 76 13 27 49]
   第一趟排序后:{38, 49}, [65 97 76 13 27 49]
   第二趟排序后:{38, 49, 65}, [97, 76, 13, 27, 49]
   第三趟排序后:{38, 49, 65, 97} [76, 13, 27, 49]
   第四趟排序后:{38, 49, 65, 76, 97} [13, 27, 49]
   第五趟排序后:{13, 38, 49, 65, 76, 97} [27, 49]
   …
插入排序性能分析

1. 复杂度
   最好情况就是,序列已经是升序排列了,
   在这种情况下,需要进行的比较操作需(n-
   1)次即可。最坏情况就是,序列是降序排
   列,那么此时需要进行的比较共有n(n-1)/2
   次。插入排序算法的时间复杂度为O(n^2)
2. 插入排序是稳定的排序方法
3. 优化后的名称:
   二分插入排序,链表插入排序,希尔排序
插入排序问题

用插入排序方法给数组排序:
[100, 27, 93, 87, 128, 40, 29, 18, 2, 2]
四. 快速排序
1. 概念
   首先任意选取数列一个数据(通常选用第一个数据)
   作为关键数据,然后将数列元素从后向前与之比较,
   所有比它小的数都放到它前面,所有比它大的数都
   放到它后面
2. 举例
   初始关键字 [49 38 65 97 76 13 27 49]
   第一次排序后:[27], 38, 65, 97, 76, 13, {49}, [49]
   第二次排序后: [27, 38], {49}, 97, 76, 13, [65, 49]
   第三次排序后: [27, 38, 13], 97, 76, {49} [65, 49]
   第四次排序后: [27, 38, 13], {49}, 76, [97, 65, 49]
   第五次排序后: [27, 38, 13], {49}, [76, 97, 65, 49]
   …
快速排序性能分析

1. 复杂度
   算法的最坏情况运行时间为θ(n^2),且最
   坏情况发生在每次划分过程产生的两个区间
   分别包含n-1个元素和1个元素的时候。平均
   复杂度为: O(nlogn)
2. 快速排序是不稳定的排序方法
   比喻: 5 3 3 4 3 8 9 10 11
3. 快速排序算法的优化算法
   随机化快排,平衡快排,外部快排,三路基
   数快排
快速排序考题

应用快速排序算法为数组排序
 [100, 27, 93, 87, 128, 40, 29, 18, 2, 2]
五.归并排序

1. 概念
   把待排序序列分为若干个子序列,每个子
   序列是有序的。然后再把有序子序列合并
   为整体有序序列。
2. 举例
   初始: {6,202,100,301,38,8,1}
   第一次: [6 202 ] [ 100 301] [ 8 38] [ 1 ]
   第二次: [ 6 100 202 301 ] [ 1 8 38 ]
   第三次: [ 1 6 8 38 100 202 301 ]
归并排序性能

1. 复杂度:
   时间复杂度O(nlogn),空间复杂度O(n)
2. 归并排序是稳定
归并排序考题

请用归并排序方法排序以下数列
[100, 27, 93, 87, 128, 40, 29, 18, 2, 2]
六. 基数排序
1.  概念
    基数排序是按照低位先排序,然后收集;再按照高位排序,
    然后再收集;依次类推,直到最高位。又称“桶子法”
2. 举例 排序:[49 38 65 97 76 13 27 49]
     个位:0(), 1(), 2(), 3(13), 4(), 5(65), 6(76), 7(97, 27), 8(38),
     9(49, 49)
     得到序列: 13, 65, 76, 97, 27, 38, 49, 49
     十位:0(), 1(13), 2(27), 3(38), 4(49, 49), 5(), 6(65), 7(76), 8(),
     9(97)
     最终的排序结果为:
     13, 27, 38, 49, 49, 65, 76, 97
基数排序性能

1. 时间复杂度为Ω(n·log n), 空间复杂度
   为 O(k·n),其中n是排序元素个数,k是数
   字位数
2. 基数排序是稳定的排序方法
基数排序方法考题

请用基数排序方法排序以下数列
[100, 27, 93, 87, 128, 40, 29, 18, 2, 2]
七. 希尔(Shell)排序

1. 概念
    通过将比较的全部元素分为几个区域来提升插入
    排序的性能。这样可以让一个元素可以一次性地
    朝最终位置前进一大步。然后算法再取越来越小
    的步长进行排序,算法的最后一步就是普通的插
    入排序,但是到了这步,需排序的数据几乎是已
    排好的了(此时插入排序较快),
2. 步长取值
    已知的最好步长序列由Marcin Ciura设计(1,4,
    10,23,57,132,301,701,1750,…)
    另一个在大数组中表现优异的步长序列是(斐波
    那契数列除去0和1将剩余的数以黄金分割比的两
    倍的幂进行运算得到的数列)
3. 举例
举例 [49 38 65 97 76 13 27 49,],取步长为4
      [49, 38, 65, 97]
      [76, 13, 27, 49]
      上面的序列可以看做一个矩阵,对列进行插入排序,得到
      [49, 13, 27, 49]
      [76, 38, 65, 97]
      横向读取,得到第一次排序结果:
      49, 13, 27, 49, 38, 65, 97, 76
第二次取步长为2, 得到
[49, 13]
[27, 49]
[38, 65]
[97, 76]
再对列进行插入排序,然后横向取值,得到[27, 13, 38, 49,49, 65, 97, 76]
第三次取步长为1,实际上就是插入排序了
希尔排序性能

1. 复杂度
   希尔排序是按照不同步长对元素进行插入排序,
   当刚开始元素很无序的时候,步长最大,所以插
   入排序的元素个数很少,速度很快;当元素基本
   有序了,步长很小, 插入排序对于有序的序列效
   率很高。所以,希尔排序的时间复杂度会比o(n^2)
   好一些, 复杂度为O(n log2 n)。这比最好的比较算
   法的O(n log n)要差一些
2. 稳定性
   一次插入排序是稳定的,不会改变相同元 素的相
   对顺序,但在不同的插入排序过程中,相同的元
   素可能在各自的插入排序中移动,最后其稳定性
   就会被打乱,所以shell排序是不稳定的。
希尔排序举例

请用希尔排序为数列排序
[100, 27, 93, 87, 128, 40, 29, 18, 2, 2]
第八. 堆排序(Heapsort)

1. 概念
   利用堆这种数据结构所设计的一种排序算法。
   堆是一个近似完全二叉树的结构,并同时满足
   堆性质:即子结点的键值或索引总是小于(或
   者大于)它的父节点
   Q:(10,15,56,25,30,70)和(70,56,
   30,25,15,10)是堆吗?
   大根堆有个显著特征就是根节点最大,每次都
   可以挑出最大的
   小根堆有个显著特征就是根节点最小,每次可
   以挑出最小的,然后进行排序
堆排序举例

用大根堆对数组排序:[49 38 65 97 76 13 27 49],
 排列出来的顺序是上面?
堆算法性能

1. 复杂度
   堆排序的平均时间复杂度为0(nlogn),空间
   复杂度为0(1)
2.是不稳定的排序方法
九. 锦标赛排序

概念
 首先对n个记录的关键字进行两两比较,
 然后在n/2个较小者之间再进行两两比较,
 如此重复,直至选出最小的记录为止。循
 环这样的操作,最后得到一个序列
十. 拓扑排序

1. 概念
    对一个有向无环图(Directed Acyclic Graph简称
    DAG)G进行拓扑排序,是将G中所有顶点排成一
    个线性序列,使得图中任意一对顶点u和v,若<u,
    v> ∈E(G),则u在线性序列中出现在v之前。
2. 拓扑方法:
   1)从有向图中选择一个没有前驱(即入度为0)的顶
   点并且输出它.
   2) 从网中删去该顶点,并且删去从该顶点发出的
   全部有向边.
   3)重复上述两步,直到剩余的网中不再存在没有前
   趋的顶点为止.
算法使用

以上十种算法都是最基础的算法,后来大
量的算法都是从中衍生过来的。不能简单
的说某种算法最好,重要的是用在最恰当
的地方。很多时候,这些算法要相互组合
使用,提高运算速率,降低计算机CPU消耗
量

More Related Content

What's hot

TQC+ 程式語言 Python 03:迴圈
TQC+ 程式語言 Python 03:迴圈TQC+ 程式語言 Python 03:迴圈
TQC+ 程式語言 Python 03:迴圈neochen2701
 
一维和二维移相光栅光强分布的计算及其在制备有序纳米硅阵列中的应用
一维和二维移相光栅光强分布的计算及其在制备有序纳米硅阵列中的应用一维和二维移相光栅光强分布的计算及其在制备有序纳米硅阵列中的应用
一维和二维移相光栅光强分布的计算及其在制备有序纳米硅阵列中的应用Minyi Yan
 
Func diff cal_exercise2-3
Func diff cal_exercise2-3Func diff cal_exercise2-3
Func diff cal_exercise2-3Alisha Smile
 
Scilab introduction(Scilab 介紹)
Scilab introduction(Scilab 介紹)Scilab introduction(Scilab 介紹)
Scilab introduction(Scilab 介紹)JIANG MING-LI
 
06.第六章用Matlab计算二重积分
06.第六章用Matlab计算二重积分06.第六章用Matlab计算二重积分
06.第六章用Matlab计算二重积分Xin Zheng
 
11.第十一章用Matlab计算多元函数的积分
11.第十一章用Matlab计算多元函数的积分11.第十一章用Matlab计算多元函数的积分
11.第十一章用Matlab计算多元函数的积分Xin Zheng
 
C1 discrete time signals and systems in the time-domain
C1 discrete time signals and systems in the time-domainC1 discrete time signals and systems in the time-domain
C1 discrete time signals and systems in the time-domainPei-Che Chang
 
資料結構-20個經典題型
資料結構-20個經典題型資料結構-20個經典題型
資料結構-20個經典題型逸 張
 
Equalization in digital communication
Equalization in digital communicationEqualization in digital communication
Equalization in digital communicationPei-Che Chang
 

What's hot (20)

TQC+ 程式語言 Python 03:迴圈
TQC+ 程式語言 Python 03:迴圈TQC+ 程式語言 Python 03:迴圈
TQC+ 程式語言 Python 03:迴圈
 
一维和二维移相光栅光强分布的计算及其在制备有序纳米硅阵列中的应用
一维和二维移相光栅光强分布的计算及其在制备有序纳米硅阵列中的应用一维和二维移相光栅光强分布的计算及其在制备有序纳米硅阵列中的应用
一维和二维移相光栅光强分布的计算及其在制备有序纳米硅阵列中的应用
 
Ch12 範例
Ch12 範例Ch12 範例
Ch12 範例
 
Ch9 範例
Ch9 範例Ch9 範例
Ch9 範例
 
Ch2 教學
Ch2 教學Ch2 教學
Ch2 教學
 
[Crypto Course] LFSR
[Crypto Course] LFSR[Crypto Course] LFSR
[Crypto Course] LFSR
 
Ch11 教學
Ch11 教學Ch11 教學
Ch11 教學
 
Ch5 教學
Ch5 教學Ch5 教學
Ch5 教學
 
Ch6 教學
Ch6 教學Ch6 教學
Ch6 教學
 
Func diff cal_exercise2-3
Func diff cal_exercise2-3Func diff cal_exercise2-3
Func diff cal_exercise2-3
 
Scilab introduction(Scilab 介紹)
Scilab introduction(Scilab 介紹)Scilab introduction(Scilab 介紹)
Scilab introduction(Scilab 介紹)
 
06.第六章用Matlab计算二重积分
06.第六章用Matlab计算二重积分06.第六章用Matlab计算二重积分
06.第六章用Matlab计算二重积分
 
Ch4 教學
Ch4 教學Ch4 教學
Ch4 教學
 
Ppt 167-173
Ppt 167-173Ppt 167-173
Ppt 167-173
 
11.第十一章用Matlab计算多元函数的积分
11.第十一章用Matlab计算多元函数的积分11.第十一章用Matlab计算多元函数的积分
11.第十一章用Matlab计算多元函数的积分
 
C1 discrete time signals and systems in the time-domain
C1 discrete time signals and systems in the time-domainC1 discrete time signals and systems in the time-domain
C1 discrete time signals and systems in the time-domain
 
資料結構-20個經典題型
資料結構-20個經典題型資料結構-20個經典題型
資料結構-20個經典題型
 
Pseudo Random Code
Pseudo Random CodePseudo Random Code
Pseudo Random Code
 
Ppt 1-50
Ppt 1-50Ppt 1-50
Ppt 1-50
 
Equalization in digital communication
Equalization in digital communicationEqualization in digital communication
Equalization in digital communication
 

Viewers also liked

Why Copy-Paste is Bad for Your Code
Why Copy-Paste is Bad for Your CodeWhy Copy-Paste is Bad for Your Code
Why Copy-Paste is Bad for Your CodeGeff Henderson Chang
 
02 P P K Teknologi E M Ternakan Ikan Merin Dalm Kolam
02 P P K  Teknologi E M Ternakan Ikan Merin Dalm Kolam02 P P K  Teknologi E M Ternakan Ikan Merin Dalm Kolam
02 P P K Teknologi E M Ternakan Ikan Merin Dalm Kolamzanua
 
T E X T L I N G U I S T I C S
T E X T  L I N G U I S T I C ST E X T  L I N G U I S T I C S
T E X T L I N G U I S T I C Szaynzz
 
Am I Qualified To Be A Licensed Counselor
Am I Qualified To Be A Licensed CounselorAm I Qualified To Be A Licensed Counselor
Am I Qualified To Be A Licensed Counselordsashere
 
Google AppEngine Has Gone StackOverflow
Google AppEngine Has Gone StackOverflowGoogle AppEngine Has Gone StackOverflow
Google AppEngine Has Gone StackOverflowGeff Henderson Chang
 
Write awesome personalized donor thank you emails using GlobalGiving and Face...
Write awesome personalized donor thank you emails using GlobalGiving and Face...Write awesome personalized donor thank you emails using GlobalGiving and Face...
Write awesome personalized donor thank you emails using GlobalGiving and Face...Marc Maxson / GlobalGiving
 
DB Replication With Rails
DB Replication With RailsDB Replication With Rails
DB Replication With Railsschoefmax
 
What you can do In WatiR
What you can do In WatiRWhat you can do In WatiR
What you can do In WatiRWesley Chen
 
Version Control and Continuous Integration
Version Control and Continuous IntegrationVersion Control and Continuous Integration
Version Control and Continuous IntegrationGeff Henderson Chang
 
GlobalGiving :- an Agile approach to the Japan Earthquake Disaster, and inter...
GlobalGiving :- an Agile approach to the Japan Earthquake Disaster, and inter...GlobalGiving :- an Agile approach to the Japan Earthquake Disaster, and inter...
GlobalGiving :- an Agile approach to the Japan Earthquake Disaster, and inter...Marc Maxson / GlobalGiving
 
Caching with Varnish
Caching with VarnishCaching with Varnish
Caching with Varnishschoefmax
 

Viewers also liked (19)

Why Copy-Paste is Bad for Your Code
Why Copy-Paste is Bad for Your CodeWhy Copy-Paste is Bad for Your Code
Why Copy-Paste is Bad for Your Code
 
02 P P K Teknologi E M Ternakan Ikan Merin Dalm Kolam
02 P P K  Teknologi E M Ternakan Ikan Merin Dalm Kolam02 P P K  Teknologi E M Ternakan Ikan Merin Dalm Kolam
02 P P K Teknologi E M Ternakan Ikan Merin Dalm Kolam
 
How to shoot great photo and video
How to shoot great photo and videoHow to shoot great photo and video
How to shoot great photo and video
 
T E X T L I N G U I S T I C S
T E X T  L I N G U I S T I C ST E X T  L I N G U I S T I C S
T E X T L I N G U I S T I C S
 
Am I Qualified To Be A Licensed Counselor
Am I Qualified To Be A Licensed CounselorAm I Qualified To Be A Licensed Counselor
Am I Qualified To Be A Licensed Counselor
 
Ell Kids Pictures
Ell Kids PicturesEll Kids Pictures
Ell Kids Pictures
 
Google AppEngine Has Gone StackOverflow
Google AppEngine Has Gone StackOverflowGoogle AppEngine Has Gone StackOverflow
Google AppEngine Has Gone StackOverflow
 
How to post your project on GlobalGiving
How to post your project on GlobalGivingHow to post your project on GlobalGiving
How to post your project on GlobalGiving
 
Obama pecha kucha
Obama pecha kuchaObama pecha kucha
Obama pecha kucha
 
Write awesome personalized donor thank you emails using GlobalGiving and Face...
Write awesome personalized donor thank you emails using GlobalGiving and Face...Write awesome personalized donor thank you emails using GlobalGiving and Face...
Write awesome personalized donor thank you emails using GlobalGiving and Face...
 
DB Replication With Rails
DB Replication With RailsDB Replication With Rails
DB Replication With Rails
 
Ushahidi in action worldwide
Ushahidi in action worldwideUshahidi in action worldwide
Ushahidi in action worldwide
 
What you can do In WatiR
What you can do In WatiRWhat you can do In WatiR
What you can do In WatiR
 
Version Control and Continuous Integration
Version Control and Continuous IntegrationVersion Control and Continuous Integration
Version Control and Continuous Integration
 
GlobalGiving :- an Agile approach to the Japan Earthquake Disaster, and inter...
GlobalGiving :- an Agile approach to the Japan Earthquake Disaster, and inter...GlobalGiving :- an Agile approach to the Japan Earthquake Disaster, and inter...
GlobalGiving :- an Agile approach to the Japan Earthquake Disaster, and inter...
 
About The Givers At Global Giving
About The Givers At Global GivingAbout The Givers At Global Giving
About The Givers At Global Giving
 
Idea webinar-oct-25-2011
Idea webinar-oct-25-2011Idea webinar-oct-25-2011
Idea webinar-oct-25-2011
 
Promise Power
Promise PowerPromise Power
Promise Power
 
Caching with Varnish
Caching with VarnishCaching with Varnish
Caching with Varnish
 

Similar to 10种排序简介

Similar to 10种排序简介 (8)

Num py basic(1) - v01
Num py   basic(1) - v01Num py   basic(1) - v01
Num py basic(1) - v01
 
Ch11
Ch11Ch11
Ch11
 
第3章 离散系统的时域分析
第3章   离散系统的时域分析第3章   离散系统的时域分析
第3章 离散系统的时域分析
 
Num py basic(2) - v01
Num py   basic(2) - v01Num py   basic(2) - v01
Num py basic(2) - v01
 
Ch12
Ch12Ch12
Ch12
 
Ch4
Ch4Ch4
Ch4
 
sorting
sortingsorting
sorting
 
人机对弈编程概述
人机对弈编程概述人机对弈编程概述
人机对弈编程概述
 

10种排序简介

  • 1. 十种常用的排序方法 1. 冒泡排序(不是最佳算法) 2. 选择排序(偶尔是最佳算法) 3. 插入排序(不是最佳算法) 4. SHELL 排序(非最佳算法) 5. 归并排序(有时是最佳算法) 6. 快速排序(有时是最佳算法) 7. 堆排序(不是最佳算法) 8. 拓扑排序 9. 锦标赛排序 10. 基数排序(最佳算法)
  • 2. 一. 冒泡排序 1. 概念 依次比较相邻的两个数,将小数放在前面,大数放在后 面。 2. 实例: 假设要排序的数组是:[49, 38, 65, 97,76, 13,27] 第一步:[38, 49, 65, 76, 13, 27, 97] 第二步:[38, 49, 65, 13, 27, 76, 97] 第三步:[38, 49, 13, 27, 65, 76, 97] 第四步:[38, 13, 27, 49, 65, 76, 97] 第五步:[13, 27, 38, 49, 65, 76, 97] 第六步:[13, 27, 38, 49, 65, 76, 97]
  • 3. 冒泡排序性能分析 1. 冒泡排序的复杂度 若记录序列的初始状态为"正序",则冒泡排序过程 只需进行一趟排序,在排序过程中只需进行n-1次比 较,且不移动记录;反之,若记录序列的初始状态 为"逆序",则需进行n(n-1)/2次比较和记录移动。 因此冒泡排序总的时间复杂度为O(n*n)。 2. 冒泡排序是稳定性的算法 不稳定的算法与稳定的算法在某些条件下可以 转化。 如果Ai = Aj, Ai原来在Aj前,排序后Ai还是要在Aj 位置前,那这个算法就是稳定的 3. 优化后的名称:鸡尾酒排序,梳排序(Comb sort)
  • 5. 二. 选择排序 1. 概念 每一趟从待排序的数据元素中选出最小(或最大)的一 个元素,顺序放在已排好序的数列的最后,直到全部待 排序的数据元素排完。常见的选择排序细分为简单选择 排序、树形选择排序(锦标赛排序)、堆排序 2. 举例 初始关键字 [49 38 65 97 76 13 27 49] 第一趟排序后 13 [38 65 97 76 49 27 49] 第二趟排序后 13 27 [65 97 76 49 38 49] 第三趟排序后 13 27 38 [97 76 49 65 49] 第四趟排序后 13 27 38 49 [76 97 65 49 ] 第五趟排序后 13 27 38 49 49 [97 65 76] 第六趟排序后 13 27 38 49 49 65 [97 76] 第七趟排序后 13 27 38 49 49 65 76 [97]
  • 6. 选择排序性能分析 1. 复杂度 比较次数与关键字的初始状态无关,总的比 较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。 交换次 数O(n),最好情况是,已经有序,交换0次;最 坏情况是,逆序,交换n-1次。 交换次数比冒 泡排序少多了,由于交换所需CPU时间比比 较所需的CPU时间多,n值较小时,选择排序 比冒泡排序快。复杂度O(n^2) 2. 选择排序是不稳定的排序方法,比喻: [5 8 5 2 9]
  • 8. 三. 插入排序 1. 概念 将数列分为已有序和无序两个部分,每次将无 序数列的第一个元素与有序数列的元素从后往 前逐个进行比较,找出插入位置。 2. 举例 初始关键字 [49 38 65 97 76 13 27 49] 第一趟排序后:{38, 49}, [65 97 76 13 27 49] 第二趟排序后:{38, 49, 65}, [97, 76, 13, 27, 49] 第三趟排序后:{38, 49, 65, 97} [76, 13, 27, 49] 第四趟排序后:{38, 49, 65, 76, 97} [13, 27, 49] 第五趟排序后:{13, 38, 49, 65, 76, 97} [27, 49] …
  • 9. 插入排序性能分析 1. 复杂度 最好情况就是,序列已经是升序排列了, 在这种情况下,需要进行的比较操作需(n- 1)次即可。最坏情况就是,序列是降序排 列,那么此时需要进行的比较共有n(n-1)/2 次。插入排序算法的时间复杂度为O(n^2) 2. 插入排序是稳定的排序方法 3. 优化后的名称: 二分插入排序,链表插入排序,希尔排序
  • 11. 四. 快速排序 1. 概念 首先任意选取数列一个数据(通常选用第一个数据) 作为关键数据,然后将数列元素从后向前与之比较, 所有比它小的数都放到它前面,所有比它大的数都 放到它后面 2. 举例 初始关键字 [49 38 65 97 76 13 27 49] 第一次排序后:[27], 38, 65, 97, 76, 13, {49}, [49] 第二次排序后: [27, 38], {49}, 97, 76, 13, [65, 49] 第三次排序后: [27, 38, 13], 97, 76, {49} [65, 49] 第四次排序后: [27, 38, 13], {49}, 76, [97, 65, 49] 第五次排序后: [27, 38, 13], {49}, [76, 97, 65, 49] …
  • 12. 快速排序性能分析 1. 复杂度 算法的最坏情况运行时间为θ(n^2),且最 坏情况发生在每次划分过程产生的两个区间 分别包含n-1个元素和1个元素的时候。平均 复杂度为: O(nlogn) 2. 快速排序是不稳定的排序方法 比喻: 5 3 3 4 3 8 9 10 11 3. 快速排序算法的优化算法 随机化快排,平衡快排,外部快排,三路基 数快排
  • 14. 五.归并排序 1. 概念 把待排序序列分为若干个子序列,每个子 序列是有序的。然后再把有序子序列合并 为整体有序序列。 2. 举例 初始: {6,202,100,301,38,8,1} 第一次: [6 202 ] [ 100 301] [ 8 38] [ 1 ] 第二次: [ 6 100 202 301 ] [ 1 8 38 ] 第三次: [ 1 6 8 38 100 202 301 ]
  • 15. 归并排序性能 1. 复杂度: 时间复杂度O(nlogn),空间复杂度O(n) 2. 归并排序是稳定
  • 17. 六. 基数排序 1. 概念 基数排序是按照低位先排序,然后收集;再按照高位排序, 然后再收集;依次类推,直到最高位。又称“桶子法” 2. 举例 排序:[49 38 65 97 76 13 27 49] 个位:0(), 1(), 2(), 3(13), 4(), 5(65), 6(76), 7(97, 27), 8(38), 9(49, 49) 得到序列: 13, 65, 76, 97, 27, 38, 49, 49 十位:0(), 1(13), 2(27), 3(38), 4(49, 49), 5(), 6(65), 7(76), 8(), 9(97) 最终的排序结果为: 13, 27, 38, 49, 49, 65, 76, 97
  • 18. 基数排序性能 1. 时间复杂度为Ω(n·log n), 空间复杂度 为 O(k·n),其中n是排序元素个数,k是数 字位数 2. 基数排序是稳定的排序方法
  • 20. 七. 希尔(Shell)排序 1. 概念 通过将比较的全部元素分为几个区域来提升插入 排序的性能。这样可以让一个元素可以一次性地 朝最终位置前进一大步。然后算法再取越来越小 的步长进行排序,算法的最后一步就是普通的插 入排序,但是到了这步,需排序的数据几乎是已 排好的了(此时插入排序较快), 2. 步长取值 已知的最好步长序列由Marcin Ciura设计(1,4, 10,23,57,132,301,701,1750,…) 另一个在大数组中表现优异的步长序列是(斐波 那契数列除去0和1将剩余的数以黄金分割比的两 倍的幂进行运算得到的数列)
  • 21. 3. 举例 举例 [49 38 65 97 76 13 27 49,],取步长为4 [49, 38, 65, 97] [76, 13, 27, 49] 上面的序列可以看做一个矩阵,对列进行插入排序,得到 [49, 13, 27, 49] [76, 38, 65, 97] 横向读取,得到第一次排序结果: 49, 13, 27, 49, 38, 65, 97, 76 第二次取步长为2, 得到 [49, 13] [27, 49] [38, 65] [97, 76] 再对列进行插入排序,然后横向取值,得到[27, 13, 38, 49,49, 65, 97, 76] 第三次取步长为1,实际上就是插入排序了
  • 22. 希尔排序性能 1. 复杂度 希尔排序是按照不同步长对元素进行插入排序, 当刚开始元素很无序的时候,步长最大,所以插 入排序的元素个数很少,速度很快;当元素基本 有序了,步长很小, 插入排序对于有序的序列效 率很高。所以,希尔排序的时间复杂度会比o(n^2) 好一些, 复杂度为O(n log2 n)。这比最好的比较算 法的O(n log n)要差一些 2. 稳定性 一次插入排序是稳定的,不会改变相同元 素的相 对顺序,但在不同的插入排序过程中,相同的元 素可能在各自的插入排序中移动,最后其稳定性 就会被打乱,所以shell排序是不稳定的。
  • 24. 第八. 堆排序(Heapsort) 1. 概念 利用堆这种数据结构所设计的一种排序算法。 堆是一个近似完全二叉树的结构,并同时满足 堆性质:即子结点的键值或索引总是小于(或 者大于)它的父节点 Q:(10,15,56,25,30,70)和(70,56, 30,25,15,10)是堆吗? 大根堆有个显著特征就是根节点最大,每次都 可以挑出最大的 小根堆有个显著特征就是根节点最小,每次可 以挑出最小的,然后进行排序
  • 25. 堆排序举例 用大根堆对数组排序:[49 38 65 97 76 13 27 49], 排列出来的顺序是上面?
  • 26. 堆算法性能 1. 复杂度 堆排序的平均时间复杂度为0(nlogn),空间 复杂度为0(1) 2.是不稳定的排序方法
  • 27. 九. 锦标赛排序 概念 首先对n个记录的关键字进行两两比较, 然后在n/2个较小者之间再进行两两比较, 如此重复,直至选出最小的记录为止。循 环这样的操作,最后得到一个序列
  • 28. 十. 拓扑排序 1. 概念 对一个有向无环图(Directed Acyclic Graph简称 DAG)G进行拓扑排序,是将G中所有顶点排成一 个线性序列,使得图中任意一对顶点u和v,若<u, v> ∈E(G),则u在线性序列中出现在v之前。 2. 拓扑方法: 1)从有向图中选择一个没有前驱(即入度为0)的顶 点并且输出它. 2) 从网中删去该顶点,并且删去从该顶点发出的 全部有向边. 3)重复上述两步,直到剩余的网中不再存在没有前 趋的顶点为止.