排序:按关键字的非递减或非递增顺序对一组记录重新进行排序的操作。
排序的稳定性:假设i位和j位的值相等,排序前后的i位和j位的前后顺序依旧不变,则称所有的排序方法是稳定的。若有一组关键字不满足要求,则该排序方法就是不稳定的。
排序中依据原则来分类:
插入排序、交换排序、选择排序、归并排序、基数排序
排序中依据过程工作量来分类:
简单排序,时间复杂度O(n2)
先进排序,时间复杂度O(nlog2n) 快速排序、归并排序、堆排序
基数排序:时间复杂度O(d·n)
插入排序:
直接插入排序:顺序查找,时间复杂度O(n2),空间复杂度O(1)
折半插入排序:折半查找,时间复杂度O(n2),空间复杂度O(1),比较次数与待排序序列的初始排列无关。
希尔排序:缩小增量排序,时间复杂度位O(n3/2), 空间复杂度O(1)。
交换排序:
冒泡排序:时间复杂度O(n2),空间复杂度O(1)。
快速排序:时间复杂度O(nlog2n),空间复杂度最好为O(log2n),最坏为O(n).
1. 附设两个指针high和low,设置枢轴关键字pivotkry。
2. 从表最右侧位置,依次向左搜索第一个关键字小于piv的记录和枢轴记录交换。
3. 从表的最左侧位置,依次向右搜索找到第一个关键字大于piv的记录和枢轴记录交换。
4. 重复2和3步骤,直到low等于high。
几趟排序后:
选择排序:
简单选择排序:时间复杂度O(n2),空间复杂度O(1)。选最小。
初始关键字:
一趟排序结果: 49 38 65 97 49 13 27 76
二趟排序结果: 13 38 65 97 49 49 27 76
三趟排序结果: 13 27 65 97 49 49 38 76
四趟排序结果: 13 27 38 49 97 49 65 76
五趟排序结果: 13 27 38 49 49 97 65 76
六趟排序结果: 13 27 38 49 49 65 97 76
七趟排序结果: 13 27 38 49 49 65 76 97
堆排序:时间复杂度O(nlog2n),空间复杂度O(1)。树形选择排序。反复进行交换和堆调整。
当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。
堆排序就是将无序序列建立成初堆以后,反复进行交换和堆调整。
详细图解可参考
http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html
归并排序:时间复杂度O(nlog2n),空间复杂度O(n)。
基数排序:不建立在关键字的基础上。
图示来源于严蔚敏的数据结构C语言版。