常见排序算法示例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
堆排序
堆排序
• 1964年,斯坦福大学计算机科学系教授Floyd和Williams 共 同发明了著名的堆排序算法( Heap Sort ) • 直接选择排序中,为了从R[1..n]中选出关键字最小的记录 ,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的 记录,又需要做n-2次比 较。事实上,后面的n-2次比较中 ,有许多比较可能在前面的n-1次比较中已经做过,但由 于前一趟排序时未保留这些比较结果,所以后一趟排序时 又重复执行 了这些比较操作。
合并排序算法示意图
平滑排序
Smooth sort
• Smoothsort is a comparison-based sorting algorithm. It is a variation of heapsort developed by Edsger Dijkstra in 1981 • Like heapsort, smoothsort builds up an implicit heap data structure in the array to be sorted, then sorts the array by continuously extracting the maximum element from that heap. • Unlike heapsort, smoothsort does not use a binary heap, but rather a custom heap based on the Leonardo numbers L(n). • The heap structure consists of a string of heaps, the sizes of which are all Leonardo numbers, and whose roots are stored in ascending order. • The advantage of this custom heap over binary heaps is that if the sequence is already sorted, it takes only time to construct and deconstruct the heap, hence the better runtime.
• 原理:利用大根堆或小根堆思想,首先建立堆,然后将堆 首与堆尾交换,堆尾之后为有序区。 • 要点:建堆、交换、调整堆 • 堆排序可以利用数组的特点快速定位指定索引的元素。
堆排序算法示意图
合并排序
合并排序
• 合并排序是建立在归并操作上的一种有效的排序算法。该 算法是采用分治法(Divide and Conquer)的一个非常典 型的应用。 • 合并排序法是将两个(或两个以上)有序表合并成一个 新的有序表,即把待排序序列分为若干个子序列,每个子 序列是有序的。 • 然后再把有序子序列合并为整体有序 序列。 • 将已有序的子序列合并,得到完全有序的序列;即先使 每个子序列有序,再使子序列段间有序。 • 若将两个有序表合并成一个有序表,称为2-路归并。 • 合并排序也叫归并排序。
19 37
5] 63 5 5 5 5 5 5
51 19 37 51 19 37 22 51 37
12] 63 12 12 12 12 12
19] 63 19 19 19 19
22] 63 51 37 22 22 22 37] 63 51 37 51] 63 37 51 63]
选择排序(selection sort)
5 2 12 [5 2 12 19 [22 19 22 37 51 63] 37 51 63]
冒泡排序算法示意图
鸡尾酒排序
鸡尾酒排序Cocktail sort
• 鸡尾酒排序,也称为搅拌排序,涟漪排序, 来回排序,是 冒泡排序的一种变形。此算法与冒泡排序的不同处在于排 序时是以双向在序列中进行排序。 • 不同的地方在于从低到高然后从高到低,而冒泡排序则仅 从低到高去比较序列里的每个元素。该算法可以得到比冒 泡排序更好的效能,原因是冒泡排序只从一个方向进行比 对(由低到高),每次循环只移动一个项目。 • 以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问两次(升 序降序各一次 )次序列就可以完成排序,但如果使用冒 泡排序则需要四次。 • 2,3,4,1,5 1,2,3,4,5
• 在冒泡排序中,只比较阵列中相邻的二项,即比较的二项的间距 (Gap)是1,梳排序提出此间距其实可大于1。 • 梳排序中,开始时的间距设定为阵列长度,并在循环中以固定比率递 减,通常递减率设定为1.3。 • 在一次循环中,梳排序如同冒泡排序一样把阵列从首到尾扫描一次, 比较及交换两项,不同的是两项的间距不固定于1。 • 如果间距递减至1,梳排序假定输入阵列大致排序好,并以冒泡排序 作最后检查及修正。
12 22
[37 51 63] 37 51 63]
12 19 [22
[2
5]
12 19
22
[37 51 63]
[2
5]
12 22
选择排序
典型应用
• 选出个子最高的 • 选出学习成绩最好的 • 选出年龄最小的
63
12
22 12
51 22 12
来自百度文库5 51 22 22
19 5
2
37
[2] 63 [2 [2 [2 [2 [2 [2 [2
22 22 22 22 2
51 5 5 2 22 22 22 5 5 5 5 5
5
19
2 19
37 [63] 37 [63] 37 [63] 37 [63]
51 2 2 5 5 5 5 22 22 22 22 19
51 19 51 19 51 51 51 51 19 19 19 22 19
63 19 19 63 19 19 19 2 2
63] 19 51 22 22
63] 2 51
插入排序(insertion sort)
不断拿到数据,且希望保持 得到的数据始终是有序的
63] 37
37 51 63]
插入排序算法示意图
冒泡排序
思考
• 体育课上的从矮到高排队 • 学生座位按照序号进行排序就坐 • 如何排序呢?
63 12 12 12 12 12 12 12 5 5 5 2
51 5 5 5 5 5 22
5
19
2 2 2
37 [63] 37 [63] 37 [63]
51 19 19 51 19 19 19 19 2 2 2 2
51 37 [63] 37 [51 63] 37 [51 63] 37 [51 63]
63 19 19 63 19 19 2 2
63 37 37 [63]
5 冒泡排序 19 22 (bubble 2 37 sort) [51 63] 5 19 2 22 [37 51 63]
19 [22
37 51 63] 37 51 63] 37 51 63] 37 51 63]
12 [19 22 12 [19 22 [12 19 22
当拿到的数据基本有序时, 12 5 只需小幅调整时,可以考虑 19 2 22 [37 51 63] 5 12 采用该方法 19 2 22 [37 51 63]
当希望最先得到最好的或若 干个最好的数据时,往往采 用这种方法
选择排序算法示意图
快速排序
快速排序算法
• Hoare在1962年提出Quicksort • 快速排序是对冒泡排序的一种改进
• 基本思想是:通过一趟排序将要排序的数据分割成 独立的两部分,其中一部分的所有数据都比另外一 部分的所有数据都要小 • 然后再按此方法对这两部分数据分别进行快速排序
12 63 22 22 22 22 22 22 12 2 2 5
22 22 63 51 51 51 51 51 2
51 51 51 63 5 5 5 5
5 5 5 5
19 19 19 19
2 2 2 2 2 2
37 37 37 37 37 37
12 12 12 12 12 12 12 12 12
22 22 22 22 22 22 5
假设输入为 84376521 目标为将之变成递增排序。 因为输入长度=8,开始时设定间距为8÷1.3≒6, 则 比较8和2、4和1,并作交换两次。 84376521 24376581 21376584 第二次循环,更新间距为6÷1.3≒4。比较2和6、1和5,直至7和4,此循环中只 须交换一次。 21376584 21346587 接下来的每次循环,间距依次递减为3 → 2 → 1, 间距=3时,不须交换 2 1 3 4 6 5 8 7 间距=2时,不须交换 2 1 3 4 6 5 8 7 间距h=1时,交换三次 21346587 12346587 12345687 1 2 3 4 5 6 7 8 上例中,共作了六次交换以完成排序。
平滑排序算法示意图
提要
• • • • • • • • • 插入排序Insertion sort 冒泡排序Bubble sort 鸡尾酒排序Cocktail sort 选择排序Selection sort 快速排序Quick sort 梳排序Comb sort 堆排序Heap sort 合并排序Merge sort 平滑排序Smooth sort
排序算法示例
提要
• • • • • • • • • 插入排序Insertion sort* 冒泡排序Bubble sort* 鸡尾酒排序Cocktail sort* 选择排序Selection sort* 快速排序Quick sort* 梳排序Comb sort* 堆排序Heap sort 合并排序Merge sort 平滑排序Smooth sort
• 整个排序过程可以递归进行,以此达到整个数据变 成有序序列。
快速排序算法示意图
梳排序
梳排序
• Wlodzimierz Dobosiewicz于1980年发明的排序算法
• 梳排序是对冒泡排序和快速排序的改进,其要旨在于消除乌龟,亦即 在阵列尾部的小数值,这些数值是造成泡沫排序缓慢的主因。相对地 ,兔子,亦即在阵列前端的大数值,不影响泡沫排序的效能。
63 12 12 12 12 12 12 12 [2 [2
12 63 22 22 22 22 22 22 5] 5]
22 22 63 51 51 51 51 51
51 51 51 63 5 5 5 5
5 5 5 5
19 19 19 19
2 2 2 2 2 2
37 37 37 37 37 37
12 12 12 12 12
插入排序
问题
• 扑克牌排序 • 考试卷排序 • 如何排序呢?
63
12
22 22
51 51 51
5 5 5 5 5
19 19 19 19 19
2 2 2 2 2 2
37 37 37 37 37 37 37
[63] 12
[12 63] 22
[12 22 63] 51 [12 22 51 [5 [5 [2 [2 12 12 5 5 22 19 12 12 63] 51 22 19 19
19 37 [63] 19 37 [63] 19 37 [63] 19 37 [63] 51 37 [63] 37 [51 63] 37 [51 63] 37 [51 63] [37 51 63]
[2] 12 [2] 12 [2] 12 [2] 12 [2] 12 [2] 12 [2] 12
63 37 37 [63]