基数排序的主要思想是选择多位基数依次进行排序,利用每次排序后还是相对有序,也就是稳定排序性质,依次比较完所有基数后,完成整个数组排序。其中,每次比较基数比如对整数进行排序时可以采用计数排序,因为整数位数有限并且每个位上的数值范围是0-9,所以最适合采用优化后计数排序对每个基数进行排序。
时间复杂度为 O(n + m),空间复杂度为 O(n + m),其中n为数组个数,m为数组最大值位数。
基数排序跟数组规模有关,假如规模很大的话,不一定比快速排序更优,故需要就具体数据模块进行分析。
一、代码实现分析
下面举一个具体例子。
假如要对数组arr={ 2,0,1,6,8,10,5,99,87,333,2,0,1 }排序,则最大值为333,这个最大值有三位数,故只需要进行三次大循环对所有原始数组arr进行个位数,十位数,百位数分别进行计数排序即可完成整个排序。
为什么分别对个位、十位、百位数进行排序后,最后整个数组arr是有序的呢?这个就是刚刚说的计数排序是稳定排序算法,经过一轮个位数排序后,整个数组消除了个位数的逆序对;此时只剩下十位和百位数的逆序对,故只需要分别对十位数和百位数进行计数排序即可消除整个数组arr的逆序对完成排序。
计数排序可以参考博主上一篇博客:计数排序算法——C++_净无邪博客-CSDN博客。
1.1具体实现步骤
a1 先找出原始数组arr最大值,求出最大值有多少个位数