排序演算法__基數排序
排序演算法__基數排序
一、介紹
基數排序的基本思想是:將整數按位數切割成不同的數字,然後按每個位數分別比較。具體做法是:將所有待比較數值統一為同樣的數位長度,數位較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成一個有序序列。
二、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;
}
三、時間複雜度和穩定性
基數排序法是屬於穩定性的排序,其時間複雜度為,其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
相關文章
- 【演算法】基數排序演算法排序
- 【資料結構與演算法】非比較排序(計數排序、桶排序、基數排序)資料結構演算法排序
- 看動畫學演算法之:排序-基數排序動畫演算法排序
- 排序演算法__計數排序排序演算法
- 計數排序vs基數排序vs桶排序排序
- 資料結構與演算法——排序演算法-基數排序資料結構演算法排序
- 桶排序和基數排序排序
- C#基數排序演算法C#排序演算法
- 經典十大排序演算法(含升序降序,基數排序含負數排序)排序演算法
- 歸併排序和基數排序排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- 演算法基礎:排序演算法:選擇排序演算法排序
- 八大排序演算法—16張圖搞懂基數排序排序演算法
- 基於桶的排序之基數排序以及排序方法總結排序
- java 基數排序Java排序
- 基於桶的排序之計數排序排序
- 夯實基礎:排序演算法之堆排序排序演算法
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- 基數排序 LSD py排序
- 【Java資料結構與演算法】第八章 快速排序、歸併排序和基數排序Java資料結構演算法排序
- 排序演算法__桶排序排序演算法
- 排序演算法__快速排序排序演算法
- 排序演算法__堆排序排序演算法
- 排序演算法:快速排序排序演算法
- 排序演算法 - 堆排序排序演算法
- 排序演算法-堆排序排序演算法
- 排序演算法 - 快速排序排序演算法
- JavaScript計數排序演算法JavaScript排序演算法
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 排序演算法--氣泡排序排序演算法
- 排序演算法:選擇排序排序演算法
- 排序演算法__氣泡排序排序演算法
- 排序演算法__選擇排序排序演算法
- 排序演算法__歸併排序排序演算法
- 排序演算法__希爾排序排序演算法
- 排序演算法–氣泡排序排序演算法
- 排序演算法:歸併排序排序演算法