2023-linux_kernel
contributed by < JoshuaLee0321
>
題目敘述如下:
而目標為利用 linux/list.h
中的 API 對快速排序法實作
divide and conquer 演算法
,而很明顯的這個演算法就會把給定的 linked list 分為兩半來處理,除此之外還要保證 stable由於知道是 quick sort,我們就可以直接填入以上AAA 到 FFF 了
struct item *pivot = list_first_entry(head, AAA, BBB);
CCC 吃四個參數,主要是為了把最前面的itm 移除掉後給list_less 或 list_greater,所以
最後的 FFF,由於是已經把 list_greater 排序好了,而很明顯這個已經排序好的 linked list 為比較大的鏈結串列,那只需要把他接在最後面,這個排序就完成了。
2023/2/28 老師我想要請問為甚麼要寫
而不是
這樣意義何在?多做一件事情不是會多消耗資源嗎?
GGGG
很明顯就是 list_for_each_entry_safe
HHHH
看起來就是要把 pivot
放入 list_less
中,而由於在 quicksort
中 pivot
會是 list_less
中最大的元素,故把他擺到 list_less
中的最後一位,也就是list_move_tail
list_move(&pivot->list, &list_greater)
IIII
跟 JJJJ
的意思為,當 list_greater 或是 list_less
中有東西的話,我就把他們擺入stack中,所以這邊應該要寫 &stack[++top]
如此一來可以保證 top往上移動並且不會撞到原本的元素stack
中的元素放入 原本的 head
中,一一把排序好的元素放回head中。stack[top]
的元素拿出來之後並且初始化KKKK
很明顯的就是 &stack[top–]其實這四行程式碼可以省略成一行,變成以下:
list_move_tail(&stack[top--], head)