基数排序-java实现

来源:互联网 发布:网络报警电话是多少 编辑:程序博客网 时间:2024/04/30 00:00

基数排序:

       

       像选择排序、插入排序、快速排序等都是基于两个元素的比较进行排序的。而基数排序无需进行元素比较,基于队列处理就能够达到排序的目的。


        基数排序不是基于排序关键字来比较排序项,而是基于排序关键字的结构。对于排序关键字中的每一个数字或字符的每一种可能取值,都会创建一个单独的队列。队列的数目就称为基数。


例如:要排序全部由小写字母组成的字符串,则基数就是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>());}//sortfor(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





0 0
原创粉丝点击