排序 - 常见排序算法知识体系详解
排序算法介绍
排序算法是《数据结构与算法》中最基本的算法之一。
排序是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
常见的内部排序算法有: 插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序 等。其中 冒泡排序和快速排序是最常见的交换排序方法 。用一张图概括:
时间复杂度
- 平方阶 (O(n2)) 排序各类简单排序:直接插入、直接选择和冒泡排序。
- 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;
- O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序
- 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。
稳定性
- 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。
- 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。
名词解释
- n:数据规模
- k:"桶"的个数
- In-place:占用常数内存,不占用额外内存
- Out-place:占用额外内存
- 稳定性:排序后2个相等键值的顺序和排序之前它们的顺序相同
排序算法
1. 交换排序
[排序 - 交换排序(Swap Sort)](/algorithm/swap- sort.html):利用交换数据元素的位置进行排序的方法称为交换排序。常见的交换排序方法有冒泡排序和快速排序。
[冒泡排序(Bubble Sort)](/algorithm/swap- sort.html#%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F):即比较相邻两元素大小,如果反序,则交换,若按照升序排序,则每次应将数据元素序列中最大元素交换到最后位置,即两两相比较,大的元素向后移动,直至将最大的交换到最后的位置,就像水中气泡一样冒出去,得名冒泡排序。
[快速排序(Quick Sort)](/algorithm/swap- sort.html#%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F):通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。
3. 选择排序
4. 插入排序
5. 希尔排序
6. 归并排序
7. 堆排序
8. 计数排序
9. 桶排序
[排序 - 桶排序(Bucket Sort)详解](/algorithm/bucket- sort.html):是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中排好序的数输出。