排序方法(8) 基數排序

2021-08-18 07:40:50 字數 2408 閱讀 6614

參考:

基數排序(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...