參考:
基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
基本思想:將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。
以lsd為例,假設原來有一串數值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 6567
8 28
9 39
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接著再進行一次分配,這次是根據十位數來分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
這時候整個數列已經排序完畢;如果排序的物件有三位數以上,則持續進行以上的動作直至最高位數為止。
lsd的基數排序適用於位數小的數列,如果位數多的話,使用msd的效率會比較好。msd的方式與lsd相反,是由高位數為基底開始進行分配,但在分配之後並不馬上合併回乙個陣列中,而是在每個「桶子」中建立「子桶」,將每個桶子中的數值按照下一數字的值分配到「子桶」中。在進行完最低位數的分配後再合併回單一的陣列中。
#include "stdio.h"
#include "math.h"
void bucketsort3(int *p, int n);
int getlooptimes(int num);
int findmaxnum(int *p, int n);
void sort2(int *p, int n, int loop);
//基數排序
void bucketsort3(int *p, int n)
printf("\n");
}}//獲取數字的位數
int getlooptimes(int num)
return count;
}//查詢陣列中的最大數
int findmaxnum(int *p, int n)
}return max;
}//將數字分配到各自的桶中,然後按照桶的順序輸出排序結果
void sort2(int *p, int n, int loop)
; //求桶的index的除數
//如798個位桶index=(798/1)%10=8
//十位桶index=(798/10)%10=9
//百位桶index=(798/100)%10=7
//tempnum為上式中的1、10、100
int tempnum = (int)pow((float)10, loop - 1);
int i, j;
for (i = 0; i < n; i++)}}
//將桶中的數,倒回到原有陣列中
int k = 0;
for (i = 0; i < 10; i++)}}
}int main()
;//;//
int *a_p = a;
int i;
//計算陣列長度
int size = sizeof(a) / sizeof(int);
printf("原始資料:\n");
for (i = 0; i < size; i++)
printf("\n\n");
//基數排序
bucketsort3(a_p, size);
//列印排序後結果
printf("\n返回結果:\n");
排序演算法8 基數排序
基數排序 基數排序的演算法思想 基數排序不同於前面的各種排序演算法,前面的排序演算法都是基於元素之間的比較好實現的,而基數排序則是利用分類進行排序的方法。演算法思想 基數排序是一種多關鍵字排序演算法。基數排序通過對所有元素根據關鍵字進行分類,然後按照關鍵字的順序將這些元素收集起來,通過這樣的方法完成...
演算法 8 基數排序
1.基數排序 1.2 include include define dbmsg fmt,args printf s s d fmt n file function line args intdump array int arr int len printf n return 0 int get po...
排序方法9 基數排序
include include include define maxe 20 線性表中最多元素個數 define maxr 10 基數的最大取值 typedef struct node nodetype void createlist nodetype p,int a,int n else t ne...