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