C鍊錶實現基數排序 主函式呼叫

2021-10-10 20:16:57 字數 2337 閱讀 3368

每次都要安利的排序視覺化**:

#include

#include

#define radix 10

//基數的數目

typedef

struct node

node;

//鍊錶節點的結構體

void

arrange

(node *arraynode, node *group,

int level)

;//鍊錶節點分組函式

void

radix_sort

(int a,

int n)

;//基數排序函式

node *

collect

(node *group)

;//對分組的資料進行收集 返回鍊錶的頭指標

intresolve

(int key,

int level)

;//對關鍵字進行 劃分為主關鍵字 和次關鍵字

void

printarr

(int a,

int length)

;int

main()

;int length =

sizeof

(a)/

sizeof

(int);

printarr

(a, length)

;radix_sort

(a, radix)

;puts

("\nfinish radix_sort");

printarr

(a, length)

;return0;

}void

radix_sort

(int a,

int n)

//基數排序函式

arraynode[j -1]

.next =

null

;//建立乙個完整的鍊錶

//為待排序的鍊錶節點進行分組操作

for(level =

1; level <=

2; level++

) arraynode =

collect

(group);}

pnode = arraynode;

j =0;

//再次初始化迴圈變數

while

(pnode)

// free(arraynode);//釋放鍊錶的空間

}int

resolve

(int key,

int level)

//對關鍵字進行 劃分為主關鍵字 和次關鍵字

return key;

}void

arrange

(node *arraynode, node *group,

int level)

//鍊錶節點分組函式

else

postnode->next = arraynode;

arraynode->next =

null;}

}node *

collect

(node *group)

//對分組的資料進行收集

else

while

(postnode->next)

group[i]

=null

;//釋放group陣列的空間

}return phead;

//返回鍊錶

}void

printarr

(int a,

int length)

}

result:

431

2650

987finish radix_sort01

2345

6789

注意:

基數排序可以有低位/高位作為關鍵點,一般使用低位,高位的**更加複雜。其平均時間複雜度為o(n*k);

思路:主要有分配和收集兩個過程,分配將元素每輪根據其位數確定其放到哪個關鍵點鍊錶上,收集將每個關鍵點的鍊錶上的元素又拿出來,拿出來的時候先進先出(符合佇列的特性)。

直到收集到最高位的數結束,其餘沒有那麼高位的數其關鍵點補為0,例如1(001)和233,第三輪分配時,001到0的關鍵點,233到2的關鍵點鍊錶位置。

基數排序(採用鍊錶)

基於兩兩比較的演算法,演算法的執行下界為 nlogn 如果想再降低時間複雜度,只能通過其他的非基於比較的方法。基數排序就是一種方法,其時間複雜度為o n 基數排序的過程,假設有4個數,我們用鍊錶把他們連一起,這4個數為 321 892 538 439 第一步 我們先建立10個鍊錶,l0 l9,然後按...

基數排序 鍊錶運用

基於兩兩比較的演算法,演算法的執行下界為 nlogn 如果想再降低時間複雜度,只能通過其他的非基於比較的方法。基數排序就是一種方法,其時間複雜度為o n 基數排序的過程,假設有4個數,我們用鍊錶把他們連一起,這4個數為 321 892 538 439 第一步 我們先建立10個鍊錶,l0 l9,然後按...

基數排序(採用鍊錶)

基於兩兩比較的演算法,演算法的執行下界為 nlogn 如果想再降低時間複雜度,只能通過其他的非基於比較的方法。基數排序就是一種方法,其時間複雜度為o n 基數排序的過程,假設有4個數,我們用鍊錶把他們連一起,這4個數為 321 892 538 439 第一步 我們先建立10個鍊錶,l0 l9,然後按...