contributed by < patri27826
>
第一個AAAA
是要填充list_tail
,那具體做法就是我在每一個迴圈中,都先去確認說下一次是不是null
,是的話就轉到下一個,因此答案為(*left->next)
不用列出參考題解,你只要專注在程式碼和你的洞見。
不用列出參考題解,你只要專注在程式碼和你的洞見。
這邊的while
,目的是要把整個列表依照pivot
值分到left
right
,因此CCCC
就是p->next
以 遍歷整個列表
linked list 為「鏈結串列」,可簡稱為 list (串列),但不可稱「链表」,該資料結構不具備任何「表」的寓意,參見中華民國教育部重編國語辭典「表」,指「分格或分項以列記事物的文件」,而 linked list 作為資料結構,全然沒有「分格」和「分項」的意涵。
這裡主要就是要把begin[i]
end[i]
分別存left
的頭尾,而begin[i+2]
end[i+2]
存right
的頭尾,讓我們再下一次迴圈中去分別比較,有點,divide and conquer
的感覺
工程人員說話要精準,避免說「感覺」
是使用到divide and conquer
的概念來實作,把大問題拆成小問題來個別解決
這個快速排序法是使用非遞迴方式,並在 linked list
上實作,主要做法如下,
begin
end
陣列, size
為 2 * n
, n
是佇列的長度left
right
的指標,以及一個 i
,記錄目前 begin
end
內元素的長度pivot
,並pivot
的都放到 left
,其他放到 right
,結果如下圖注意用語。
資訊科技詞彙翻譯
將left
的頭尾分別存到 begin[i]
end[i]
將 right
的頭尾分別存到 begin[i+2] end[i+2]
最後把 pivot
存到begin[i+1]
end[i+1]
pivit
會逐漸右移,並且每次都先去處理 pivot
右邊部分的佇列,等到右邊部分的到達終止條件,終止條件就是 begin[i] = end[i]
,也就是只剩下一個元素,這時則將 right
的部分加入 result
,如下圖。
i--
, 會將所有 begin[i] = end[i]
的點加入 result
,其餘的長度 >1
的佇列,則要再進行一次 Divide and Conquer
,直到所有人都變成單一節點,再依次加入 result
這份程式碼有幾個特點,
pivot
選擇第一個元素begin
end
陣列來模擬遞迴的情況改進的方向有如下
pivot
上,如果只透過挑選最左邊的 pivot
,如果遇到已排序的陣列,反而是更消耗運算時間,所以如何有效率地挑選 pivot
可以是一個優化方向
pivot
值,可以避免選取到最小或是最大值的可能性。quick sort
可能反而會對排序需要花費更多的時間,或許可以設一個 threshold
,大於他可以使用 quick sort
,小於他就去呼叫較為簡單的排序法,例如 bubble sort
insertion sort
無論標題和內文中,中文和英文字元之間要有空白字元 (對排版和文字搜尋有利)
在 merge
函式,目的是要把 a
b
合併,接著利用迴圈比較 a , b 的第一個節點,將較小者加入新鏈結串列的尾部, 加入後要將 tail 指標向後移,下次加入節點時才能繼續加入鏈結串列尾端, 因此 BBBB 為 &a->next,CCCC 則為 &b->next。
在 build_prev_link
中,目的是要把 prev
連接起來,通過一個迴圈,逐一走訪每個節點,並在最後把 head
tail
之間的鏈結接起來,因此 DDDD
是 tail->next
, EEEE
是 head->prev
在我看完程式碼後,直覺上會覺得 merge_final
跟 merge
這兩個函式太像了,只有頭跟尾巴的操作以及參數有差異,我會認為這兩個函式是可以合併的,但就會需要考慮到兩邊的 input
跟額外操作等等,但會是一個可以改進的方向
不用列出參考題解,你只要專注在程式碼和你的洞見。
這個 find 函數的目的是在指定的 hash table
中查找特定值 num 對應的索引。