基於兩兩比較的演算法,演算法的執行下界為ω(nlogn),如果想再降低時間複雜度,只能通過其他的非基於比較的方法。基數排序就是一種方法,其時間複雜度為o(n)
基數排序的過程,假設有4個數,我們用鍊錶把他們連一起,這4個數為
321 892 538 439
第一步:我們先建立10個鍊錶,l0~l9,然後按4個數的個位的數字,依次接到相應鍊錶的後面
l0 l1 321
l2 892
l3l4
l5l6
l7l8 538
l9 439
第二步:按連線在鍊錶從l0~l9的數字,我們依照先後順序,重新生成乙個新的鍊錶
321 892 538 439
然後根據各個數的十位數,我們重新把他們連線到各個鍊錶後面
l0 l1
l2 321
l3 538 439
l4l5
l6l7
l8
l9 892
第三步:按連線在鍊錶從l0~l9的數字,我們依照先後順序,重新生成乙個新的鍊錶
321 538 439 892
然後根據各個數的百位數,我們重新把他們連線到各個鍊錶後面
l0 l1
l2
l3 321
l4 439
l5 538
l6l7
l8 892
l9
總結步:按連線在鍊錶從l0~l9的數字,我們依照先後順序,重新生成乙個新的鍊錶
321 439 538 892
至此,排序結果完成
完整**如下:
(使用單鏈表實現的)
[cpp]view plain
copy
#include
using
namespace
std;
typedef
struct
node
lnode;
void
initiate(lnode **head)
void
insert(lnode *head,
intnum)
q->next=p;
} }
lnode * getfirstnode(lnode *head)
} void
p->next=node;
node->next=null;
} }
void
total(lnode *l,lnode *head)
p->next=head->next;
} int
power(
inta,
intn)
return
y;
} int
getnum(lnode *p,
inti)
//第二個形參表示參加排序的整數最大位數一共有count位數字
void
radix_sort(lnode *head,
intcount)
//鍊錶從頭到尾掃瞄,並將掃瞄到的節點脫離鍊錶。
while
(head->next!=null)
//將10個鍊錶從0-9依次連線到head節點後面
for(i=0;i<10;i++)
} for(i=0;i<10;i++)
} void
printsl(lnode *head)
} void
main()
附上使用雙向鍊錶實現的**:
[cpp]view plain
copy
#include
#include
using
namespace
std;
intpower(
inta,
intn)
//使用遞迴,o(logn),求a的n次方
return
y;
} typedef
struct
node
slnode;
slnode * create(int
n)
head->prior=head;
head->next=head;
q=head;
for(i=0;i
head->prior=q;
q->next=head;
return
head;
} void
printsl(slnode *head)
} slnode * getfirstnode(slnode *head)
else
p=null;
return
p;
} int
get_num(slnode *p,
inti)
//得到第i個數
void
addnode(slnode *head,slnode *p)
void
} void
radix_sort(slnode *head,
intn)
//實習基數排序
for(i=0;i
while
(head->next!=head)
for(f=0;f<10;f++)
} for
(i=0;i<10;i++)
//刪除節點
delete
(lhead[i]);
} void
main()
基數排序(採用鍊錶)
基於兩兩比較的演算法,演算法的執行下界為 nlogn 如果想再降低時間複雜度,只能通過其他的非基於比較的方法。基數排序就是一種方法,其時間複雜度為o n 基數排序的過程,假設有4個數,我們用鍊錶把他們連一起,這4個數為 321 892 538 439 第一步 我們先建立10個鍊錶,l0 l9,然後按...
基數排序(採用鍊錶)
基於兩兩比較的演算法,演算法的執行下界為 nlogn 如果想再降低時間複雜度,只能通過其他的非基於比較的方法。基數排序就是一種方法,其時間複雜度為o n 基數排序的過程,假設有4個數,我們用鍊錶把他們連一起,這4個數為 321 892 538 439 第一步 我們先建立10個鍊錶,l0 l9,然後按...
動態鍊錶實現基數排序,插入排序
includeusing namespace std struct node class listnode int node yx int i return x listnode listnode listnode listnode delete root cout n n 呼叫析構函式 void ...