單鏈表實現基數排序

2022-05-08 20:24:08 字數 3643 閱讀 8975

基數排序是通過「分配」和「收集」過程來實現排序

(1)假設有欲排資料序列如下所示:

73  22  93  43  55  14  28  65  39  81

首先根據個位數的數值,在遍歷資料時將它們各自分配到編號0至9的桶(個位數值與桶號一一對應)中。

分配結果(邏輯想象)如下圖所示:

分配結束後。接下來將所有桶中所盛資料按照桶號由小到大(桶中由頂至底)依次重新收集串起來,得到如下仍然無序的資料序列:

81  22  73  93  43  14  55  65  28  39

接著,再進行一次分配,這次根據十位數值來分配(原理同上),分配結果(邏輯想象)如下圖所示:

分配結束後。接下來再將所有桶中所盛的資料(原理同上)依次重新收集串接起來,得到如下的資料序列:

14  22  28  39  43  55  65  73  81  93

觀察可以看到,此時原無序資料序列已經排序完畢。如果排序的資料序列有三位數以上的資料,則重複進行以上的動作直至最高位數為止。

** (c語言實現)

1

#ifndef __singly_linked_list_h__

2#define __singly_linked_list_h__

34 typedef int

elementtype;

5struct

node;

6 typedef struct node*ptrtonode;

7typedef ptrtonode list;

8typedef ptrtonode position;910

struct

node11;

15void createlist(list*);

16void

deletelist(list);

17int

isempty(list);

18int

islast(position, list);

19position header(list);

20position first(list);

21position advance(position);

22position find(elementtype, list);

23elementtype getat(position);

24void

makeempty(list);

25void

delete(elementtype, list);

26void

insert(elementtype, position, list);

27void

insertfront(elementtype, list);

28void

insertback(elementtype, list);

2930

#endif

31void createlist(list*l)

3237

38void

deletelist(list l)

3943

44int

isempty(list l)

4548

49int

islast(position p, list l)

5053

54position header(list l)

5558

59position first(list l)

6063

64position advance(position p)

6568

69position find(elementtype x, list l)

7076

return

p;77}78

79elementtype getat(position p)

8083

84void

makeempty(list l)

8595 l->next =null;96}

9798

void

delete(elementtype x, list l)

99106

if(!islast(p, l))

107116

}117

118void

insert(elementtype x, position p, list l)

119126

127void

insertfront(elementtype x, list l)

128137

138void

insertback(elementtype x, list l)

139

1 #include 2 #include 3 #include "

singlylinkedlist.h"4

5#define n 10 //

排序的數個數

6#define b 10 //

桶數,即基數

7#define p 3 //位數8

9void radixsort(int

arr);

10int getdigit(int x, int

y);11

void printarray(int arr, int

size);

1213

intmain()

14; //

10, 3

18//

int arr[n] = ;

19//

int arr[n] = ;

//13, 2

2021 printf("

before sort: ");

22printarray(arr, n);

2324

radixsort(arr);

2526 printf("

after sort: ");

27printarray(arr, n);

2829 system("

pause");

30return0;

31}3233

void radixsort(int

arr)

3452 k = 0;53

//將每趟排序後的結果存回arr

54for(j=0; jj)

5562}63

}6465for(i=0; ii)

66deletelist(bucket[i]);67}

6869

70//

取整數x的倒數第y位數字,y從0開始

71int getdigit(int x, int

y)72

7879

80void printarray(int arr, int

size)

8187 printf("\n"

);88 }

參考1參考2

單鏈表實現基數排序

1 2 單鏈表實現基數排序3 45 介面標頭檔案 6 typedef int elementtype 78 ifndef list h 9 define list h 10 include 11 12struct node 13 typedef struct node ptrtonode 14typ...

基數排序單鏈表實現 C語言

標頭檔案 基數排序,單鏈表實現 ifndef radix sort h define radix sort h include define flowover 1 define list empty 2 struct radixsort typedef struct radixsort list t...

c 實現基數排序

以下介紹內容 百科 基數排序的方式可以採用lsd least significant digital 或msd most significant digital lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。以lsd為例,假設原來有一串數值如下所示 73,22,93,43,...