基数排序稳定性:稳定
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。
基数排序
基本思想
像选择排序、插入排序、快速排序等都是基于两个元素的比较进行排序的。而基数排序无需进行元素比较,基于队列处理就能够达到排序的目的。
基数排序不是基于排序关键字来比较排序项,而是基于排序关键字的结构。对于排序关键字中的每一个数字或字符的每一种可能取值,都会创建一个单独的队列。队列的数目就称为基数。
例如:要排序全部由小写字母组成的字符串,则基数就是26,就会用到26个单独的队列。如果对十进制数进行排序,则基数应该是10。
为什么不是所有的排序都使用基数排序算法呢?
1.基数排序算法要根据给定问题特别设计;
2.如果排序关键字中的数字数目与列表中元素的数目接近,那么算法的时间复杂度接近O(n平方);
3.基数影响空间复杂度。
算法分析
在基数排序中,没有任何元素的比较和交换,元素只是在每一轮中从一个队列移动到另一个队列。对于给定的基数,遍历数据的轮次是一个常数,它与排序关键字的数目无关,于是,基数排序算法的时间复杂度为O(n)。
Java实现
/**
* 基数排序
* 时间复杂度:O(nlog2n)
* @param data
*/
public static voidradixSort(int[] data){
String temp;
int numObj;
int digit,num;
Queue<Integer>[] digitQueue =(LinkedList<Integer>[])(new LinkedList[10]);
for(int digitVal = 0; digitVal <= 9;digitVal++){
digitQueue[digitVal] =(Queue<Integer>)(new LinkedList<Integer>());
}
//sort
for(int pos = 0; pos <= 3; pos++){
for(int scan = 0; scan <data.length; scan++){
temp = String.valueOf(data[scan]);
digit =Character.digit(temp.charAt((3 - pos)), 10);
digitQueue[digit].add(newInteger(data[scan]));
}
num = 0;
for(int digitVal = 0; digitVal <= 9;digitVal++){
while(!(digitQueue[digitVal]).isEmpty()){
numObj =digitQueue[digitVal].remove();
data[num] = numObj;
num++;
}
}
}
}