圖說演算法使用JavaScript(十八)

7-8基數排序法

基數排序法和我們之前所討論到的排序法不一樣,它並不需要進行元素間的比較動作,而是屬於一種分配模式排序方式。基數排序法依照比較的方式。基數排序法依照比較的方向可分為最有效鍵優先(Most Significant Digit First, MSD)和最無效鍵優先(Least Significaant Digit First, LSD)兩種。MSD法是從最左邊的位數開始比較,而LSD則是從最右邊的位數開始比較。

以下的範例我們以LSD將三位數的整數資料來加以排序,它是依個位數、十位數、百位數來進行排序。請直接看以下最無效鍵優先(LSD)例子的說明,便可清楚的知道它的動作原理:

原始資料如下:

JS            radix.js

//基數排序法 由小到大排序
var inputarr=(data, size)=> {
	for (i=0; i<size; i++) {
		data[i]=Math.floor(Math.random()*1000);
		//設定data值最大為3位數
	}
}

var showdata=(data, size)=> {
	for (i=0; i<size; i++) process.stdout.write(data[i]+' ');
		console.log();
}

var radix=(data, size)=> {
	for (n=1; n<=100; n=n*10)
	{
		var tmp=new Array();
		for (var i=0; i<10; i++) {
			tmp[i]=new Array();
			for (var j=0; j<10; j++) {
				tmp[i][j]=0;
			}
		}

		for (i=0; i<size; i++) 
		{
			m=Math.floor((data[i]/n))%10;
			tmp[m][i]=data[i];
		}
		k=0;
		for (i=0; i<10; i++)
		{
			for(j=0; j<10; j++)
			{
				if (tmp[i][j] !=0)
				{
					data[k]=tmp[i][j];
					k++;
				}
			}
		}
		process.stdout.write("經過"+n+"位數排序後:");
		showdata(data, size);
	}

}

var data=new Array(100);
for (i=0; i<100; i++) data[i]=0;
const prompt=require('prompt-sync')();
size = prompt('請輸入陣列大小(100以下):');
process.stdout.write('您輸入的原始資料是:');
console.log();
inputarr(data,size);
showdata(data,size);
radix(data,size);