單鏈表快速排序

2021-05-24 10:33:06 字數 1592 閱讀 3444

今天在學習《程式設計師使用演算法》時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己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 ;  

15.//鍊錶快排序函式  

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

17.//列印鍊錶  

18.void print_list(struct node *head)   

23.    printf("/n");  

24.}  

25.int main(void)   

42.      

43.    print_list(head);  

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

45.    qlistsort(&head, null);  

46.    print_list(head);  

47.    return 0;  

48.}  

49. 

50.void qlistsort(struct node **head, struct node *end) else   

74.        }  

75.        //合併鍊錶  

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

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

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

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

80.        if(left_walk > right_walk) else   

89.    } while (count > 1);   

90.} 

單鏈表快速排序

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

單鏈表快速排序

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

單鏈表快速排序

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