基數排序(Radix Sort)

基數排序

是一種非比較型整數排序算法,其原理是將整數按位數切割成不一樣的數字,而後按每一個位數分別比較。因爲整數也能夠表達字符串(好比名字或日期)和特定格式的浮點數,因此基數排序也不是隻能使用於整數。基數排序的發明能夠追溯到1887年赫爾曼·何樂禮打孔卡片製表機(Tabulation Machine)上的貢獻[1]php

它是這樣實現的:將全部待比較數值(正整數)統一爲一樣的數位長度,數位較短的數前面補零。而後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成之後, 數列就變成一個有序序列。ios

排序過程演示

好比這樣一個數列排序: 342 58 576 356, 如下描述演示了具體的排序過程(紅色字體表示正在排序的數位)算法

第一次排序(個位):字體

3 4 2spa

5 7 6blog

3 5 6排序

0 5 8ip

第二次排序(十位):ci

4 2字符串

5 6

5 8

7 6

第三次排序(百位):

0 5 8

3 4 2

3 5 6

5 7 6

結果: 58 342 356 576

示例代碼

#include<iostream>
#include<math.h>
using namespace std;

//默認數據都是天然數
int data[8]={123,9,0,78,56,234,1223,78};

//獲得數字的倒數第N位
void getNofData(int ds[],int NofData[],int n,int length){
	
	int *tempDS=(int *)malloc(sizeof(int)*length);
	for(int i=0;i<length;i++)
		tempDS[i]=ds[i];		
	for(int i=0;i<n;i++){		
		for(int j=0;j<length;j++){
			NofData[j]=tempDS[j]%10;
			tempDS[j]=tempDS[j]/10;
		}
	}	
}

int myRadixSort(int ds[],int length){
	//find the max of ds
	int max=ds[0];
	for(int i=1;i<length;i++)
		if(ds[i]>max)
			max=ds[i];
	//判斷最大位數
	int maxBits=1;
	while(max=max/10)
		maxBits+=1;

	int *NofData=(int *)malloc(sizeof(int)*length);
	for(int i=1;i<=maxBits;i++){		
		getNofData(ds,NofData,i,length);

	//如下是插入排序
	//從第二個元素開始掃描
	for(int i=1;i<length;i++){
		//若是當前元素大於已排序元素,跳出循環,從下一元素開始執行
		//這次將插入排序,作小小改動,將">"改成">="
		if(NofData[i]>=NofData[i-1])
			continue;
		//保存當前元素,將已排序的最後一個元素後移(已比較過)
		int temp=NofData[i];
		int tempDS=ds[i];
		ds[i]=ds[i-1];
		NofData[i]=NofData[i-1];
		//從已排序的倒數第二個元素開始(若是有的話)
		int j=i-2;
		for(;j>=0;j--)
			//若是當前元素大於要插入元素,當前元素向後移,不然跳出
			if(NofData[j]>temp){
				ds[j+1]=ds[j];
				NofData[j+1]=NofData[j];
			}
			else
				break;
		//插入待排序元素
		NofData[j+1]=temp;
		ds[j+1]=tempDS;		
	}
	
} 
	return 0;
}


int main(){
	myRadixSort(data,8);
	for(int i=0;i<8;i++)
		cout<<data[i]<<" ";
	getchar();
	return 0;
}
相關文章
相關標籤/搜索