每次都要安利的排序視覺化**:
result:#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)
}
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,然後按...