基數排序 鍊錶運用

2021-07-24 22:54:26 字數 2953 閱讀 4173

基於兩兩比較的演算法,演算法的執行下界為ω(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 ...