排序演算法__基數排序

Enjoy_process發表於2019-03-08

                                               排序演算法__基數排序

 

 

一、介紹

基數排序的基本思想是:將整數按位數切割成不同的數字,然後按每個位數分別比較。具體做法是:將所有待比較數值統一為同樣的數位長度,數位較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成一個有序序列。

 

二、C++實現

#include<iostream>
#include<algorithm>

using namespace std;

int getMax(int a[],int n)
{
	int ans=a[0];
	for(int i=1;i<n;i++) ans=max(ans,a[i]);
	return ans;
}

void countSort(int a[],int n,int exp)
{
	int tmp[n];//臨時陣列
	int buckets[10]={0};//記錄每個數的權值為exp的位的值出現了多少次 
	for(int i=0;i<n;i++) buckets[(a[i]/exp)%10]++; 
	for(int i=1;i<n;i++) buckets[i]+=buckets[i-1];//操作後的buckets[i]的值就是它tmp陣列中的位置 
	for(int i=n-1;i>=0;i--)//此處迴圈不能從0到n-1 
	{
		int k=(a[i]/exp)%10;
		tmp[buckets[k]-1]=a[i];//此處減1是因為從0開始儲存的 
		buckets[k]--;
	}
	for(int i=0;i<n;i++) a[i]=tmp[i];
}

void radixSort(int a[],int n)
{
	int _max=getMax(a,n);
	for(int exp=1;_max/exp>0;exp*=10) countSort(a,n,exp);
}

int main()
{
	int a[]={10,2,3,6,5,4,8,7,9,1};
	int len=sizeof(a)/sizeof(a[0]);
	printf("排序前:");
	for(int i=0;i<len;i++)
	  printf("%d ",a[i]);
	radixSort(a,len);
	printf("\n排序後:");
	for(int i=0;i<len;i++)
	  printf("%d ",a[i]);
	return 0;
}

三、時間複雜度和穩定性

基數排序法是屬於穩定性的排序,其時間複雜度為O (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

相關文章