1. 程式人生 > >基數排序(RadixSort)思想與實現

基數排序(RadixSort)思想與實現

  基數排序屬於高階的排序方法,該排序演算法是在“桶排序”的基礎上所進行的改進,讀者若是想了解“桶排序”思想,可以點選這裡。接下來介紹一下基數排序的思想。

(1) 基數排序的思想

  基數排序的思想就是:首先定義10個“桶”,下標為0~9,且只能用“佇列”來定義,這裡後面會有解釋;然後遍歷陣列,按照元素的“個位”數值,依次放入對應下標的桶中,放完所有元素後,從第0個桶開始遍歷,以此取出桶中元素按順序放入原始陣列中;同理,之後再遍歷陣列,按照元素的“十位”數值,做上一步相同的操作;以此類推,直到按照陣列中最大元素的最高位操作完為止。

  PS:佇列有“先進先出”的特點,所以有一陣列(9   2   3   10),按照“個位”進行操作完後,陣列變為:10   2   3   9,之後按照“十位”進行操作,可見2,3,9的“十位”為0,故依次放入了第0個“桶”中,10放入了第1個“桶”中;若“桶”用的是“棧”來定義,因為是“先進後出”,在取出2,3,9時,順序為:9,3,2,明顯取出順序反了

;所以,“桶”要使用“佇列”來定義。

為了更好地理解該排序演算法,我們來看以下圖片:


從上圖可知,原始陣列為:10   1234   9   7234   67   9181   733   197   7   3,以排升序為例,接下來進行分步操作。

  第一步:按照“個位”,將10放入了第0個桶;將9181放入了第1個桶;將733、3放入了第3個桶;將1234、7234放入了第4個桶;將67、197、7放入了第7個桶;將9放入了第9個桶。然後,從第0個桶開始,依次取出元素並重賦值到原始陣列中,陣列變為:10   9181   733   3   1234   7234   67   197   7   9。

  第二步:按照“十位”,將3、7、9放入第0個桶;將10放入第1桶;將733、1234、7234放入第3個桶;將67放入第6個桶;將9181放入第8個桶;將197放入第9個桶。然後,從第0個桶開始,依次取出元素並重賦值到原始陣列中,陣列變為:3   7   9   10   733   1234   7234   67   9181   197。

  第三步:按照“百位”,將3、7、9、10、67放入第0個桶;將197、9181放入第1個桶;將1234、7234放入第2個桶;將733放入第7個桶。然後,從第0個桶開始,依次取出元素並重賦值到原始陣列中,陣列變為:3   7   9   10   67   197   9181   1234   7234   733。

  第四步:按照“千位”,將3、7、9、10、67、197、733放入第0個桶;將1234放入第1桶;將7234放入第7個桶;將9181放入第9個桶。然後,從第0個桶開始,依次取出元素並重賦值到原始陣列中,陣列變為:3   7   9   10   67   197   733   1234   7234   9181。

(2) 基數排序的實現

  本次排序演算法採用C++模版程式設計來實現。

#include <iostream>
#include <iterator>
#include <queue>
#include <cmath>


using std::cout;
using std::endl;
using std::ostream_iterator;
using std::queue;

template<class T,size_t N>
void PrintArr(T (&arr)[N]){
	copy(arr,arr+N,ostream_iterator<T>(cout," "));
	cout << endl;
}


template<class T,size_t N>
void RadixSort(T (&arr)[N]){
	queue<T> buckets[10];
	size_t i,j,temp,n(0),flag(0);
	while(flag < N){
		i = 0;j = 0;
		while(i < N){
			temp = arr[i]/pow(10,n);
			temp = temp%10;
			buckets[temp].push(arr[i]);
			i++;
		}
		flag = buckets[0].size();
		i = 0;
		while(i < 10){
			while(!buckets[i].empty()){
				arr[j] = buckets[i].front();
				buckets[i].pop();
				j++;
			}
			i++;
		}
		PrintArr(arr);
		n++;
	}
}


int main(){
	int arr[] = {10,1234,9,7234,67,9181,733,197,7,3};
	cout << "The init:" << endl;
	PrintArr(arr);
	cout << "The sort:" << endl;
	RadixSort(arr);
	cout << "The final:" << endl;
	PrintArr(arr);
}

原始陣列為:10   1234   9   7234   67    9181   733   197   7   3

程式執行結果為:3   7   9   10   67   197   733   1234   7234   9181