1. 程式人生 > >【單鏈表排序】基於C++的單鏈表排序

【單鏈表排序】基於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²);