数据结构复习之【排序】
排序:对一序列对象根据某个关键字进行排序;
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
内排序:所有排序操作都在内存中完成;
外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
排序耗时的操作:比较、移动;
排序分类:
(1)交换类:冒泡排序、快速排序;此类的特点是通过不断的比较和交换进行排序;
(2)插入类:简单插入排序、希尔排序;此类的特点是通过插入的手段进行排序;
(3)选择类:简单选择排序、堆排序;此类的特点是看准了再移动;
(4)归并类:归并排序;此类的特点是先分割后合并;
历史进程:一开始排序算法的复杂度都在O(n^2),希尔排序的出现打破了这个僵局;
以下视频是Sapientia University创作的,用跳舞的形式演示排序步骤,这些视频就可以当作复习排序的资料~
冒泡排序视频:http://v.youku.com/v_show/id_XMzMyOTAyMzQ0.html
选择排序视频:http://v.youku.com/v_show/id_XMzMyODk5MDI0.html
插入排序视频:http://v.youku.com/v_show/id_XMzMyODk3NjI4.html
希尔排序视频:http://v.youku.com/v_show/id_XMzMyODk5MzI4.html
归并排序视频:http://v.youku.com/v_show/id_XMzMyODk5Njg4.html
快速排序视频:http://v.youku.com/v_show/id_XMzMyODk4NTQ4.html
上面介绍的排序算法都是基于排序的,还有一类算法不是基于比较的排序算法,即计数排序、基数排序;
此种实现方法是最简单的排序实现;
缺点是每次找最小值都是单纯的找,而没有为下一次寻找做出铺垫;
算法如下:
索引
1
2
3
4
5
6
7
8
9
此时,如果increment=3,则i%3相等的索引为一组,比如索引1,1+3,1+3*2
一般增量公式为:increment = increment/3+1;
算法实现如下:
不稳定排序算法,是简单选择排序的改进版;
思想:构建一棵完全二叉树,首先构建大根堆,然后每次都把根节点即最大值移除,并用编号最后的节点替代,这时数组长度减一,然后重新构建大根堆,以此类推;
注意:此排序方法不适用于个数少的序列,因为初始构建堆需要时间;
算法实现如下:
总结:每个排序都有每个排序的优点,我们需要在适当的时候用适当的算法;
比如在基本有序、数组规模小时用直接插入排序;
比如在大数组时用快速排序;
比如如果要想稳定性,则使用归并排序;
摘录维基百科图片:

