(快速总结了桶排序和基数排序,由于近期项目比较忙,很多地方没有考虑完整,日后有空再回来修改)
桶排序:
将数组分配到有限数量的桶子里,每个桶子再个别排序。
下列中:将数据作为桶(数组)的下标存储,适合于数据值的范围比较小;比如:求在1G大小的字符串中,出现次数最多的那个字符;因为字符char的边界是[0...255],就可以将所有的字符遍历、存储到[0...255]桶中(数组下标).
基数排序:
可以理解为对桶排序的扩充,将数据分别按个位、十位、百位...分别放入buckets[0...9][num]的桶中。
即:先将个位数存储到[0...9]的桶中,个位数将排好序
再按照个位数排好的序,将十位数存储到[0...9]的桶中,十位数排好序(个位数上一轮已经排好序)...
再百位,千位...每次放入桶中后,桶的顺序、桶内数据的顺序是排好的。
例如:
下例中数组:
int array[] = {2, 343, 342, 1, 123, 43, 4343, 433, 687, 654, 3};
按个位依次排序(到桶中)
0|
1|1,
2|2,342
3|343,123,43,4343,433,3
4|654
5|
6|
7|687
8|
9|
按值的顺序存入到array[] = {1,2,342,343,123,43,4343,433,3,654,687};
由此可见,个位数是排好序的;
再将array[] = {1,2,342,343,123,43,4343,433,3,654,687}按十位数依次排序
0|1,2,3
1|
2|123
3|433
4|342,343,43,4343
5|654
6| <
桶排序:
将数组分配到有限数量的桶子里,每个桶子再个别排序。
下列中:将数据作为桶(数组)的下标存储,适合于数据值的范围比较小;比如:求在1G大小的字符串中,出现次数最多的那个字符;因为字符char的边界是[0...255],就可以将所有的字符遍历、存储到[0...255]桶中(数组下标).
基数排序:
可以理解为对桶排序的扩充,将数据分别按个位、十位、百位...分别放入buckets[0...9][num]的桶中。
即:先将个位数存储到[0...9]的桶中,个位数将排好序
再按照个位数排好的序,将十位数存储到[0...9]的桶中,十位数排好序(个位数上一轮已经排好序)...
再百位,千位...每次放入桶中后,桶的顺序、桶内数据的顺序是排好的。
例如:
下例中数组:
int array[] = {2, 343, 342, 1, 123, 43, 4343, 433, 687, 654, 3};
按个位依次排序(到桶中)
0|
1|1,
2|2,342
3|343,123,43,4343,433,3
4|654
5|
6|
7|687
8|
9|
按值的顺序存入到array[] = {1,2,342,343,123,43,4343,433,3,654,687};
由此可见,个位数是排好序的;
再将array[] = {1,2,342,343,123,43,4343,433,3,654,687}按十位数依次排序
0|1,2,3
1|
2|123
3|433
4|342,343,43,4343
5|654
6| <