演算法 基數排序

2022-08-19 01:01:19 字數 1961 閱讀 7300

基數排序是桶排序的一種,屬於穩定性的排序。

洛谷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,以個位數數字為桶編號依次入...