1. 程式人生 > >基數排序-java實現

基數排序-java實現

基數排序:

       像選擇排序、插入排序、快速排序等都是基於兩個元素的比較進行排序的。而基數排序無需進行元素比較,基於佇列處理就能夠達到排序的目的。

        基數排序不是基於排序關鍵字來比較排序項,而是基於排序關鍵字的結構。對於排序關鍵字中的每一個數字或字元的每一種可能取值,都會建立一個單獨的佇列。佇列的數目就稱為基數。

例如:要排序全部由小寫字母組成的字串,則基數就是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