本部分内容包括:归并排序、桶排序、基数排序、计数排序、希尔排序
代码实现:
见我的github:排序(归并、桶排、基数排序、计数排序)
一、归并排序
设计思路
1、数组分成两段,每段去排序
2、排序时判断这两段是否越界,越界停止返回
3、实行归并
注意事项:灌装数组的时候,需要注意temp数组的起始位置。
二、桶排序
设计思路:桶排序就是对一组数据进行区间分类,0~10在一个桶,11-20在一个桶,如此哈希,然后每个桶内进行排序,一般按照进桶的先后顺序进行插入排序,所以,桶排序一般采用hash的数据结构,类似下图:
1、创建桶
2、找出最大最小值(设置array[0]存最大值,array[1]存最小值),并确定桶的间距
3、桶的间距加1是为了向上取整
4、哈希数据(哈希之后使用插入排序,对桶内进行排序)
5、整理为数组并返回
注意事项:桶的间距加1是为了向上取整
三、基数排序
设计思路:首先进行数据预处理(包括数组判空、边界判断、找出基数排序的位数),再进行基数排序(按照位数进行循环排序、再根据桶内数据统计合并)
1、数据预处理
1.1、数组判空
1.2、边界判断
1.3、找出基数排序的位数
2、基数排序
2.1、按照位数进行循环排序
2.2、根据桶内数据统计合并
注意事项:不能节省1处的--至2处,1处在循环体内,不判断不执行,但是2处的每次判断均会执行。
四、计数排序
设计思路:两个数组,一个是原始数组,另外一个是统计数组(在一次循环内统计原始数组中每个数出现的次数)。
1、找出原始数组的最大最小值
2、定义新的数组大小 min到max之间,闭区间,有(max-min+1)个数字
3、一次循环统计数据——优化掉最小值之前的无用存储
4、返回新数组
4.1、优化前方案——两次循环,需判空,浪费循环次数
4.2、优化后方案
注意事项:数组内的元素跨度大,不适合使用计数排序。
五、希尔排序
设计思路:
1、将一个数组,分成k组,每组自身进行排序,然后缩小分组量,再排序,直到分组量到1,即全排序
2、在每个分组内,我们从头排到尾
3、每个单独的队伍,我们采用插入排序
注意事项:
见图片的注释部分