数据结构——排序:插入排序、选择排序、交换排序、归并排序、基数排序

排序

内部排序:数据量不大,在内存中可以完成排序。

外部排序:借助外存。把数据文件分成若干块,涉及内外存数据的转换、存储器的管理等。

稳定排序:能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。

不稳定排序:不是上面稳定的情况。

稳定的排序算法:直接插入排序、冒泡排序、归并排序
不稳定的排序算法:希尔排序、快速排序、简单选择排序、堆排序

参考:八大排序算法 http://www.javashuo.com/article/p-tvwvrgad-ev.html

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

插入排序

来一个,插一个。

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以直接插入排序是稳定的。

 

希尔排序:也是一种插入排序。

上面先增量为5,再增量为3

最后再增量为1,就是全体排序。

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

交换排序

冒泡排序

快速排序

选择一个元素,放到它自己合适的位置,它的前面都比他小,他的后面都比他大。

比他小的往前站,比他大的往后站。前面和后面的顺序不管。

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

选择排序

先选取最小的,作为第一个

再选取当前最小的最为第二个数。

....

堆排序

一种选择排序

堆排序是一种树形选择排序,是对直接选择排序的有效改进。

上面非终端节点就是非叶子节点,中间的点。

首先创建一个堆。再输出堆顶元素。剩下的元素再调整成堆。。。

创建堆过程:

1、先当做完全二叉树罗列起来。

2、调整成为堆:

从最后一个非终端节点,不满足堆就交换。不断把小的往上推。。。。

注意上图,49和13交换后,49下来对下面的影响,再调整。

最后,13输出后,再把97放在最上面,再调整。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

归并排序:

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

基数排序:

基数排序之前,先说桶排序:桶式排序是一种分配排序。

简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的再进行排序(不管什么方式)。

基数排序:(用多趟桶排序

对数字型或字符型的单关键字,可以看作由多个数位或多个字符构成的多关键字,此时可以采用“分配-收集”的方法进行排序,这一过程称作基数排序法,其中每个数字或字符可能的取值个数称为基数。比如,扑克牌的花色基数为4,面值基数为13。在整理扑克牌时,既可以先按花色整理,也可以先按面值整理。按花色整理时,先按红、黑、方、花的顺序分成4摞(分配),再按此顺序再叠放在一起(收集),然后按面值的顺序分成13摞(分配),再按此顺序叠放在一起(收集),如此进行二次分配和收集即可将扑克牌排列有序。