單鏈表快速排序

2021-06-01 05:02:22 字數 1367 閱讀 8477

今天在學習《程式設計師使用演算法》時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。

單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同:單鏈表不支援基於下標的訪問。故書中把待排序的鍊錶拆分為2個子鍊錶。為了簡單起見,選擇鍊錶的第乙個節點作為基準,然後進行比較,比基準大節點的放入左面的子鍊錶,比基準大的放入右邊的子鍊錶。在對待排序鍊錶掃瞄一遍之後,左面子鍊錶的節點值都小於基準的值,右邊子鍊錶的值都大於基準的值,然後把基準插入到鍊錶中,並作為連線兩個子鍊錶的橋梁。然後根據左右子煉表中節點數,選擇較小的進行遞迴快速排序,而對數目較多的則進行跌等待排序,以提高效能。

排序函式中使用的變數如下:

struct node *right;   //右邊子鍊錶的第乙個節點

struct node **left_walk, **right_walk;    //作為指標,把其指向的節點加入到相應的子鍊錶中

struct node *pivot, *old;    //pivot為基準, old為迴圈整個待排序鍊錶的指標

核心**如下:

for (old = (*head)->next; old != end; old = old->next) else ;  

//鍊錶快排序函式   

void qlistsort(struct node **head, struct node *head);  

//列印鍊錶   

void print_list(struct node *head)   

printf("/n");  

}  int main(void)   

print_list(head);  

printf("---------------------------------/n");  

qlistsort(&head, null);  

print_list(head);  

return 0;  

}  void qlistsort(struct node **head, struct node *end)  else   

}  //合併鍊錶   

*right_walk = end;       //結束右鍊錶   

*left_walk = pivot;      //把基準置於正確的位置上   

pivot->next = right;     //把鍊錶合併   

//對較小的子鍊錶進行快排序,較大的子鍊錶進行迭代排序。   

if(left_walk > right_walk)  else   

} while (count > 1);   

}  

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...