《2018年3月11日》【连续152天】
标题:插入排序(折半插入排序,希尔排序),归并排序(k路归并),基数排序(桶排序);
内容:
A.直接插入排序就是将要插入的数放在一个有序数列中第一个大于它的数的位置,该位置的数和其后的数都退一位;
折半插入排序:插入排序耗时态度,可用折半法进行优化:
进行比较时,优先于中间数比较;
希尔排序(Shell's Sort):又称缩小增量排序,是不稳定排序;
如图,按照增量,把距离为增量的数放到一组进行直接插入排序;
然后逐步减小增量,直到增量为1;
第一趟增量为5,然后是3,1;
B.2路归并之前学过,今天学习了一下k路归并:
方法一:模仿2路归并。将k个排好序的数组的头一个元素取出,进行比较,将最小的放到新数组中,然后取最小数组的下一个元素,在进行比较;
方法二:利用最小堆的性质:
将每个数列的第一个元素取出,用堆排序选出最小的,然后将其队列的下一个元素放入堆中,
这里就要考虑当取出最小元素时,其队列是否有下一个元素:
可以设一个无穷大值,放在每个队列之后,
也可以进行如下操作:
将root输出时,将末尾元素放在root处,然后用minheapify进行整理,这样,最小堆的大小就变成了K-1;
方法三:胜者数k路归并:
其实就是对最小元素进行锦标赛排序:
把堆顶的元素输出后,进行整理,再在底部输入新元素,与最小堆方法类似;
基数排序:多关键字的排序
这里主要讲桶排序:
且是十位数基数排序:
例: 54 37 78 97 87 74 64 77
先将这些数按照个位数进行桶分类:
4: 54 74 64
7:37 97 87 77
8:78
然后按顺序取出,再按照十位数进行桶分类:
3:37
5:54
6:64
7:74 77 78
8:87
9:97
网上还有其他桶排序的方法:
是将数的范围放到一个数组中,例如排序百位数以下的数,就建立一个a[101]的数组,置0,然后进行数数,
遇到15,就a[15]++;