第九章 排序
- 9.1 基础知识
- 9.2交换排序
- 9.3插入排序
- [9.4 选择排序](https://blog.csdn.net/qq_43413403/article/details/106998340)
- [9.5 归并排序](https://blog.csdn.net/qq_43413403/article/details/107005368)
- [9.6 基数排序](https://blog.csdn.net/qq_43413403/article/details/107008196)
- [9.7 各种排序方法的选择和使用](https://blog.csdn.net/qq_43413403/article/details/107008824)
所谓排序(Sorting),就是对数据元素集合建立某种有序排列的过程。排序在计算机软件系统设计中占有相当重要的地位,特别是在事务处理系统中,需要经常对有关的数据排序,以便提高检索等操作的效串。
这个目录页作为一个内容大纲,附有一些习题。还有一点助记符。
9.1 基础知识
- 排序:设含有n个数据元素的数据表为:{R[0],R[1],…,R[n-1]},其相应的关键字序列为:{K[0],K[1],…,K[n-1]}。所谓排序,是确定0,1,…,n-1的一种排列p0,p1,…pn-1,使各关键字满足如下的递增(或递减)关系:K[p0]<=K[p1]<=…<=K[pn-1]或K[p0]>=K[p1]>=…>=K[pn-1]。
也就是说,排序是恨据关键字递增或递减的顺序,把数据元素依次排列起来,使任意次序排列的数据表变成按其关键字有字排列的数据表。 - 排序的稳定性:如果在数据表中任意两个数据元素R[i]和 R[j](i≠j),它们的关键字相等(K[i]=K[j]),且在排序之前,数据元素R[i]在R[j]的前面,如果在排序之后,数据元素R[i]一定在数据元素R[j]的前面,即不改变关键字相同的数据元素在排序前、后的相对位置,则称这种排序方法是稳定的,否则称这种排序方法是不稳定的。
虽然稳定的排序方法和不稳定的排序方法排结果有差别,但不能说不稳定的排序方法就不好,它们各有各的适应场合。一般情况下,不稳定的排序方法效率比较高,稳定的排序方法效率比较低。 - 内部排与外部排序:根据在排序过程中数据元素是否全部在内存中进行,排序可分为两大类:内排序和外排序。
内排序是指在排序过程中数据元素全部存放在内存进行的排序;外排序是指由于数据元素太多,在排序期间全部数据元素不能同时存放在内存中,必须在排序过程中,不断地在内存和外存之间交换数据元素的排序。
适用于内排序的排序方法叫作内排序方法,适用于外排序的排序方法叫作外排序方法。由于内排序是外排序的基础,所以下面仅介绍内排序的分各种方法。 - 排序的效率:排序是经常使用的一种运算,因此,排序效率的高低最为人们所注意,排序算法的效率可以从时间复杂度和空间复杂度两个方面来分析。排序算法的时间复杂度可用排序过程中的数据元素之关键字的比较次数与数据元素的移动次数来衡。
5.排序方法分类:
(1)如果按时向复杂度来区分,一般可分为三类:
- 简单的排序方法,其时间复杂度为O(n2);
- 快速的排序方法,其时间复杂度为O(nlog2n);
- 基数排序,其时间复杂度为O(d*n)。
(2)如果按排序过程中数据元素的位置是否改变可将排序方法分为两类:静态排序和动态排序。 - 静态排序方法在排序过程中对数据元素位置进行物理重排,经过比较和判断,将数据元素移到合适的位置,这时数据元素一般都存放在一个顺序表中;
- 动态排序方法在排序过程中数据元素的物理位置不变,每个元素增加一个链接指针,在排序的过程中仅通过修改链接指针来改变元素之间的逻辑顺序,从而达到排序的目的,这时通过链表组织待排序的数据元素。
9.2交换排序
9.2.1 冒泡排序 最大放最后
9.2.2 快速排序 [ 左< ] k [ 右> ]
9.3插入排序
9.3.1 直接插入排序(顺序表、链表) [已经有序] <-- k [还没有序,待插入]
9.3.2 折半插入排序(折半插入排序、斐波那契插入、二路插入) low mid high
9.3.3 希尔排序 按d分组
9.4 选择排序
9.4.1 简单选择排序(顺序表和链表) 最小放最前
9.4.2 锦标赛排序 完全二叉树
9.4.3 堆排序 大顶堆取顶放最后
9.5 归并排序
9.5.1 归并
9.5.2 两路归并排序
9.5.3 递归的归并排序
9.6 基数排序
9.6.1 多关键字排序 MSD/LSD
9.6.2 链式基数排序 分散与回收
9.7 各种排序方法的选择和使用
补充链接,筛选法:C++实现筛选法