基數排序是桶排序的一種,屬於穩定性的排序。
洛谷1177 排序
題目描述
將讀入的 n 個數從小到大排序後輸出。
輸入格式
第 1 行為乙個正整數 n。
第 2 行包含 n 個空格隔開的正整數 a[i],為你需要進行排序的數,資料保證了a[i]不超過10^9。
輸出格式
將給定的 n個數從小到大輸出,數之間用空格隔開。
輸入輸出樣例
輸入
5
4 2 4 5 1
輸出
1 2 4 4 5
說明提示
對於20% 的資料,有 n <= 10^3。
對於100% 的資料,有 n <=10^5 。
基數排序往往都用每位上的數字來排序,但這樣就只能對非負整數進行排序了(之所以此題能用基數排序ac,就是因為所有的資料中沒有負數,否則就崩了)。演算法是先依據每個元素的個位上的數字進行桶排序,即開乙個陣列base[i][j]表示第j個個位數字為i的數的值,之後按i從0到9的順序再將這些數放回原陣列中。接著再去按十位、百位、千位這麼排下去直到排到的位數是陣列中最大元素的位數時,就排序完成了。
舉個例子,方便理解。
初始狀態:712,303,4,18,89,999,70,26
第一次按個位排序:070,712,303,004,026,018,089,999
第二次按十位排序:303,004, 712,018,026, 070,089,999
第三次按百位排序:004,018,026,070,089,303,712,999
最後算一下演算法時間複雜度:三重迴圈,第一重迴圈的是位數digit(這裡digit表示a陣列中最大元素的位數,又因為a陣列是int型別的,所以digit連10都沒到,是個很小的數),第二重迴圈加上第三重迴圈總共也就n次,所以時間複雜度為o(digit * n)級別,速度極快無比。
# include # include # include # include using namespace std;
const int n_max = 100000;
int n;
int a[n_max + 10];
int base[10][n_max + 10];
int countmaxdigit()
if (cnt == 0) cnt = 1; // 如果說num = 0,那麼位數也應當是1
return cnt;
}void radixsort()
int now = 0;
for (int i = 0; i <= 9; i++)
for (int j = 1; j <= base[i][0]; j++)
a[++now] = base[i][j];
ten *= 10; }}
int main()
基數排序演算法
include stdafx.h include iostream include math.h using namespace std struct radixsort 建立迴圈鍊錶 radixsort creatlink else le ls ls new radixsort 為下乙個節點在堆記...
基數排序演算法
以下內容為程式 int quicksort int p,int n extern int insertsort int p,int n static int partition int p,int n,int m static int quick sort int p,int n 快速排序演算法在 ...
基數排序演算法
經典排序演算法 基數排序radix sort 原理類似桶排序,這裡總是需要10個桶,多次使用 首先以個位數的值進行裝桶,即個位數為1則放入1號桶,為9則放入9號桶,暫時忽視十位數 例如 待排序陣列 62,14,59,88,16 簡單點五個數字 分配10個桶,桶編號為0 9,以個位數數字為桶編號依次入...