Linux 核心设计: 2023q1 第一周测验题
测验 1
|
|
如果 linked list 的节点数量为 0 或 1,此时 linked list 已经有序了,无需进行处理
|
|
将 linked list 的第一个节点作为 pivot 分离出原 linked list,并新建两个 linked list 用于后续接收原 linked list 的节点,less
用于接收值 $< pivot$ 的节点,而 greater
用于接收值 $\ge pivot$ 的节点:
- 原 linked list
- 处理后
预期想要将原 linked_list 处理成 $< pivot\ |\ pivot\ | \ge pivot$ 的序列,即 less
获取原 linked list 中的 $< pivot$ 的节点,greater
获取 $\ge pivot$ 的节点,这是为了满足 stable 的要求:
Stable sort algorithms sort equal elements in the same order that they appear in the input.
所以这样处理后得到的序列,所有 $=pivot$ 的节点里 pivot
仍然排在最前面,与原 linked list 的位置关系一致
|
|
接下来遍历原 linked_list,依据节点和 pivot
的关系,使用 list_move_tail
将其加入 less
或 greater
。这里使用 list_move_tail
一方面是尾插入保证了原序列的顺序关系 (符合 stable),另一方面是它的作用是先进行移除在插入,保证了原 linked list 结构的正确性。这一步处理完成后,原 linked_list 此时为空,后续我们会将排序完成的 linked list 节点重新插入回它。
|
|
然后对 $< pivot$ 的 less
和 $\ge pivot$ 的 greater
分别进行快速排序,排序完成后再处理成
$$< pivot (sorted)\ |\ pivot\ | \ge pivot (sorted)$$
|
|
即大功告成
l = [1 1 1]
,然后追踪该例子排序的过程。在我实作的源代码中,是通过节点的地址来判断是否满足 stable sorting 的要求的。