基數排序 C語言版

2021-06-26 07:58:33 字數 2357 閱讀 3388

先說說基數排序的思想

基數排序是非比較型的排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。

將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。在每一次排序中,按照當前位把陣列元素放到對應的桶當中,然後把桶0到桶9中的元素按先進先出的方式放回陣列中。這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。

穩定性和複雜度:

基數排序是穩定的排序演算法;時間複雜度為o(k×n),空間複雜度為o(n),其中k為陣列最大數的位數,n為陣列元素的個數。

基數排序的方式可以採用lsd(least significant digital)或msd(most significant digital),lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。lsd適用於陣列中元素位數不多的情況,而msd則剛好相反,適用於陣列中元素位數較多的情況。

我在這裡是按lsd的方式編寫的**。

下面是我用c語言實現的基數排序,是鏈式基數排序演算法,如果有什麼錯誤請大家指出,謝謝。

#include #include #include #include #define radixcount 10  //桶的個數,桶號:0 1 2 ..... 9

#define randmax 100000 //隨機數的最大值加1+

struct node ;

struct queue ;

void getrandarray(int array, int size);

void radixsort(int array, int size);

void printarray(int array, int size);

int getmaxlength(int array, int size);

void distributenumbers(int array, int size, struct queue bucket, int dividend);

void rearrangearray(int array, int size, struct queue bucket);

void issorted(int array, int size);

int main(int argc, char const *argv)

//利用偽隨機數填充陣列array

void getrandarray(int array, int size)

}//基數排序,按從小到大的順序進行排列

void radixsort(int array, int size)

int maxlength = getmaxlength(array, size);

int dividend = 1;

for (i = 0; i < maxlength; ++i)

}//獲取陣列array中最大數的長度(位數)

int getmaxlength(int array, int size)

}int length = 1;

while ((max /= 10) != 0)

return length;

}//把陣列array中的數放到對應的桶中,桶的底層是用鏈式佇列實現的

void distributenumbers(int array, int size, struct queue bucket, int dividend)

else

}}//把桶0..9中的數按放入桶中的先後次序放回到陣列array中

void rearrangearray(int array, int size, struct queue bucket)

}}void printarray(int array, int size)

printf("\n\n");

}//判斷陣列array是否已經是有序的

void issorted(int array, int size)

}if (unsorted) else

}

由於多寫了判斷陣列是否有序的子程式和生成偽隨機數組的子程式,還有就是因為要充分利用記憶體所以我用了鍊錶來充當桶的角色,綜上所述會讓程式顯得比較臃腫,不過核心演算法部分還是比較簡練的,希望大家能指出我的程式中錯誤和不足之處。

我在網上還見過一種利用陣列來充當桶的角色的程式,利用陣列充當桶可以讓**十分簡潔,效率也特別高,但是這種方法有乙個致命的弱點就是待排序的陣列大小不能太大,否則充當桶的陣列將會過於龐大(由於單個桶的大小需要和陣列的大小一致,而每個桶都放不滿),空間複雜度達到o(10*n),空間利用率太低。

其他八種排序演算法的部落格:

常見的9種內部排序(c語言實現)

基數排序(C語言版本)

基本思想 將所有待比較數值 正整數 統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。include includeint getwidth int a,int n return time 獲取乙個數第...

c語言基數排序 桶排序

如果要排序的數字都是k位組成的十進位制數,如3位的489,就可以採用基數排序,也稱為桶排序 排序步驟 對有效位為k的十進位制數,可以把每個數字看成乙個分量,如有效位為3的379的分量為3 7 9,設定十個桶,編號為0 1 2 3.9 1 將要排序的n個整數置於乙個單向佇列中 2 依次將佇列中的每個數...

基數排序 C

首先我們引入乙個多關鍵排序的概念 多關鍵字排序 假如現在有乙個員工表,要求按照薪資排序,年鈴相同的員工按照年齡排序。比如氣泡排序就是一種穩定排序,堆排序就是不穩定的排序,品,你細細的品 那麼對32,13,94,52,17,54,93排序,是否可以看做多關鍵字排序?比如32 13 52排序,先看個位2...