基数排序:
像选择排序、插入排序、快速排序等都是基于两个元素的比较进行排序的。而基数排序无需进行元素比较,基于队列处理就能够达到排序的目的。
基数排序不是基于排序关键字来比较排序项,而是基于排序关键字的结构。对于排序关键字中的每一个数字或字符的每一种可能取值,都会创建一个单独的队列。队列的数目就称为基数。
例如:要排序全部由小写字母组成的字符串,则基数就是26,就会用到26个单独的队列。如果对十进制数进行排序,则基数应该是10.
时间复杂度分析:
在基数排序中,没有任何元素的比较和交换,元素只是在每一轮中从一个队列移动到另一个队列。对于给定的基数,遍历数据的轮次是一个常数,它与排序关键字的数目无关,于是,基数排序算法的时间复杂度为O(n).
为什么不是所有的排序都使用基数排序算法呢?
1.基数排序算法要根据给定问题特别设计;
2.如果排序关键字中的数字数目与列表中元素的数目接近,那么算法的时间复杂度接近O(n平方);
3.基数影响空间复杂度。
Code:
/*
*Created on 2016年7月12日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*/
package org.cy.sort;
import java.util.LinkedList;
import java.util.Queue;
public class RadixSort {
public static void main(String[] args) {
int[] data = {1112,7839,2345,6666,6766,1113,9909,1000};
String tmp;
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++){
tmp = String.valueOf(data[scan]);
digit = Character.digit(tmp.charAt((3 - pos)), 10);
digitQueue[digit].add(new Integer(data[scan]));
}
num = 0;
for(int digitVal = 0; digitVal <= 9; digitVal++){
while(!(digitQueue[digitVal]).isEmpty()){
numObj = digitQueue[digitVal].remove();
data[num] = numObj;
num++;
}
}
}
for(int scan = 0; scan < data.length; scan++){
System.out.print(data[scan] + " ");
}
}
}
res:
1000 1112 1113 2345 6666 6766 7839 9909