先說說基數排序的思想:
基數排序是非比較型的排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。
將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。在每一次排序中,按照當前位把陣列元素放到對應的桶當中,然後把桶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...