我一直挺想整理一下排序的,但是由于我的拖延症我整整把这个文章拖了三年啊!!!(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)今天!2020.1.1我终于开始写了!!!
排序的一些基本概念
排序是数据处理中经常使用的一种操作,其主要目的是便于查找。
- 在排序(sort)问题中,通常将数据元素称为记录(record)。
- 将待排序记录扫描一遍称为一趟(pass)。
- 排序的定义
给定一个记录序列( r 1 、 r 2 、 … 、 r n r_1、r_2、…、r_n r1、r2、…、rn)其关键码分别为( k 1 、 k 2 、 … 、 k n k_1、k_2、…、k_n k1、k2、…、kn),排序是将这些记录排列成顺序为( r s 1 、 r s 2 、 … 、 r s n r_{s1}、r_{s2}、…、r_{sn} rs1、rs2、…、rsn)的一个序列,使得相应的关键码满足升序或降序。简言之:排序是将一个记录的任意序列重新排列成一个按关键码有序的序列。 - 算法的稳定性
假设在待排序的记录序列中有多个具有相同关键码的记录,若经过排序,这些记录的相对此项保持不变,及在原序列中 k i = k j k_i=k_j ki=kj,且 k i k_i ki在 k j k_j kj之前,而排序后的序列中 k i k_i ki仍在 k j k_j kj之前,则称这种算法是稳定的;反之不稳定。
排序的分类
-
根据排序过程中待排序的所有记录是否全部被放置在内存中,可分为内排序和外排序。
- 内排序:排序过程中,待排序的所有记录全部被放置在内存中。
- 排序:排序过程中,由于待排序记录个数太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据才能得到排序结果。
-
根据排序方法是否建立在关键码比较的基础上,可分为基于比较的排序和不基于比较的排序。
排序算法的性能
- 排序算法的时间开销是衡量其好坏的最重要的标志。
对于基于比较的内排序,在排序过程中通常需要进行下列两种基本操作
①比较,关键码之间的比较;
②移动,记录从一个位置移动到另一个位置。
所以,在待排序的记录个数一定的条件下,算法的执行时间主要消耗在关键码之间的比较和记录的移动上。因此,高效率的排序算法应该具有尽可能少的关键码比较次数和尽可能少的记录移动次数。 - 评价排序算法的另一个主要标准是执行算法所需要的辅助存储空间。 辅助存储空间是指在待排序的记录个数一定的条件下,除了存放待排序记录占用的存储空间之外,执行算法所需要的其他存储空间。
- 算法本身的复杂程度也是一个要考虑的因素。
- 稳定性不是衡量算法好坏的标准。
排序算法思想及代码
插入排序
主要思想是每次讲一个待排序记录插入到一个已经排好序的序列中,直到全部记录都排好序。
详细内容点击排序——插入排序(直接插入排序,折半插入排序,希尔排序)
交换排序
主要思想是在待排序序列中选出两个记录,比较其关键码,如果反序则交换。
详细内容点击排序——插入排序(交换排序、快速排序)
选择排序
主要思想是每趟排序在待排序序列中选出关键码最小(或最大)值,加入到有序序列中。
详细内容点击排序——选择排序(简单选择排序、堆排序)
…………未完待续
各种排序的比较
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 | 适用范围 |
---|---|---|---|---|---|---|
直接插入排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O(1) | 稳定 | 顺序存储、链式存储 |
希尔排序 | / | / | O ( n 2 ) O(n^2) O(n2) | O(1) | 不稳定 | 顺序存储 |
冒泡排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O(1) | 稳定 | 顺序存储、链式存储 |
快速排序 | O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) | O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) | O ( n 2 ) O(n^2) O(n2) | O ( l o g 2 n ) − O ( n 2 ) O(log_2n) - O(n^2) O(log2n)−O(n2) | 不稳定 | 顺序存储、链式存储 |
简单选择排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O(1) | 不稳定 | 顺序存储、链式存储 |
堆排序 | O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) | O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) | O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) | O(1) | 不稳定 | 顺序存储、链式存储 |
补充:希尔排序比较特殊,详细看上边链接。