一、排序
1.并非所有的内部排序算法都要基于比较操作,基数排序不基于比较。
2.算法中哨兵的作用:临时存储和判断数组边界(?)
二、插入排序
1.直接插入排序
(1)插入排序在实现上通常采用就地排序(空间复杂度为O(1));
(2)比较次数和移动次数取决于待排序表的初始状态;
(3)是一个稳定的排序方法;
(4)适用性:适用于顺序存储和链式存储的线性表。
2.折半插入排序
(1)减少了比较元素的次数;
(2)是一种稳定的排序方法。
3.希尔排序(缩小增量排序)
(1)组内进行直接插入排序;
(2)空间复杂度O(1);
(3)是一种不稳定的排序方法;
(4)适用性:适用于线性表为顺序存储的情况。
三、交换排序
1.冒泡排序
(1)是一种稳定的排序方法;
(2)每趟排序都会将一个元素放置到最终的位置上。
2.快速排序
(1)性能主要取决于划分操作的好坏;
(2)快速排序是递归的,需要一个递归工作栈,平均情况下栈深O(log2n);
(3)快速排序是所有内部排序算法中平均性能最优的排序算法;
(4)是一种不稳定的排序方法;
(5)每趟排序后会将基准元素放到最终的位置上。
四、选择排序
每一趟从待排序元素中选取关键字最小的元素。
1.简单选择排序
(1)每一趟排序可以确定一个元素的最终位置;
(2)元素的比较次数与序列的初始状态无关,始终是n(n-1)/2次;
(3)是一种不稳定的排序方法。
2.堆排序
(1)适合关键字较多的情况;
(2)是一种不稳定的排序方法。
五、归并排序和基数排序
1.2路归并排序
(1)是一种稳定的排序方法。
2.基数排序
(1)不基于比较和移动进行排序,而基于关键字各位的大小进行排序;
(2)一趟排序需要的辅助存储空间为r(r个队列:r个队头指针和r个队尾指针),空间复杂度为O(r);
(3)时间复杂度:O(d(n+r)),与序列的初始状态无关;
(4)是一种稳定的排序方法。
六、内部排序算法的比较
算法种类 | 时间复杂度 | 空间复杂度 | 是否稳定 | ||
最好情况 | 平均情况 | 最坏情况 | |||
直接插入排序 | O(n) | O(n^2) | O(n^2) | O(1) | 是 |
冒泡排序 | O(n) | O(n^2) | O(n^2) | O(1) | 是 |
简单选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 否 |
希尔排序 | O(1) | 否 | |||
快速排序 | O(nlog2n) | O(nlog2n) | O(n^2) | O(log2n) | 否 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 否 |
2路归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 是 |
基数排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(r) | 是 |