【單鏈表排序】基於C++的單鏈表排序
1.單鏈表的排序,排序演算法有很多種,但是大多數是基於單鏈表的順序儲存的,單鏈表的排序要怎麼實現。
大家都知道單鏈表最重要的就是指標,因為單鏈表不是順序儲存的,所以對排序時必須是指標的後移,才能訪問下一個節點,而且迴圈中往往判斷的是最後一個指標是否指向為空進行判斷的,基本都是使用while(條件迴圈)。但是事實上上我們也可以根據單鏈表的長度進行for迴圈,在去排序。
1.使用for迴圈(氣泡排序)
程式碼如下:
void sort_list(LNodep pHeader){
LNodep p;
LNodep r;
if(p==NULL){
return ;
}
int i,j,temp;
int len=length_list(pHeader);
for(i=0 ,p=pHeader->next;i<len-1;++i,p=p->next){
for(j=i+1,r=p->next; j<len;++j,r=r->next){
if(p->data>r->data){
temp=p->data;
p->data=r->data;
r->data=temp;
}
}
}
}
使用到了length_list()
int length_list(LNodep pHeader){
LNodep p=pHeader->next;
int i=0;
while(p!=NULL){
++ i;
p=p->next;
}
return i;
}
由於是氣泡排序,時間複雜度O(n²),效能比較差。
2 while條件迴圈
判斷最後節點是否為空
void sort_listArray(LNodep pHeader){
LNodep p,r,s;
p=pHeader->next;
r=p->next;
s=r->next;
int temp;
while(p!=NULL){
while(r!=NULL ){
if(p->data>r->data){
temp=p->data;
p->data=r->data;
r->data=temp;
r=r->next;
}
else{
// printf("此方法被執行!!!\n");
r=r->next;
}
}
// printf("指向方法被執行\n");
p=p->next;
r=s;
}
}
時間複雜度為O(n²);