C 使用有限的操作集对50000个数字的2个链表进行排序
所以我有一个学校项目:我有一个50000个数字的链表和第二个空列表。我只有非常有限的说明书。它们是:C 使用有限的操作集对50000个数字的2个链表进行排序,c,algorithm,list,sorting,optimization,C,Algorithm,List,Sorting,Optimization,所以我有一个学校项目:我有一个50000个数字的链表和第二个空列表。我只有非常有限的说明书。它们是: “sa”交换列表1的前两个元素 “sb”交换列表2的前两个元素 “ss”同时是“sa”和“sb” “pa”:将列表2的顶部元素推到列表1的顶部 “pb”:将列表1的顶部元素推到列表2的顶部 “ra”:旋转列表1(第一个元素变为最后一个) “rb”:旋转列表2(第一个变为最后一个) “rr”:“ra”和“rb”同时出现 “rra”:轮换列表1(最后一个变为第一个) “rrb”:轮换列表2(最后一
- “sa”交换列表1的前两个元素
- “sb”交换列表2的前两个元素
- “ss”同时是“sa”和“sb”
- “pa”:将列表2的顶部元素推到列表1的顶部
- “pb”:将列表1的顶部元素推到列表2的顶部
- “ra”:旋转列表1(第一个元素变为最后一个)
- “rb”:旋转列表2(第一个变为最后一个)
- “rr”:“ra”和“rb”同时出现
- “rra”:轮换列表1(最后一个变为第一个)
- “rrb”:轮换列表2(最后一个变为第一个)
- “rrr”:“rra”和“rrb”同时出现
我尝试了一个非常简单的算法,旋转列表1,直到最大值位于顶部,然后重复将其推到列表2中,直到所有内容都在列表2中,然后将所有内容推回到列表1中,但我无法在合理的时间内对超过5k个数字的列表进行排序我想我已经找到了使用快速排序的方法。这里有一些伪代码 编辑:更新了伪代码,以关注它在做什么,而不是不必要的语法
quicksort(int n)
if n == 1 return
int top_half_len = 0
choose a median //it's up to you to determine the best way to do this
for 0 to n { //filter all values above the median into list 2
if (value > median) {
push list 1 top to list 2 //list 2 stores the larger half
top_half_len++
}
rotate list 1 forward
}
//reverse the list back to original position
rotate list 1 backward (n - top_half_len) times
//push larger half onto smaller half
push list 2 top to list 1 top_half_len times
//recursively call this on the larger half
quicksort(top_half_len)
//rotate smaller half to front
rotate list 1 forward top_half_len times
//recursively call this on smaller half
quicksort(n - top_half_len)
//reverse list back to original position
rotate list 1 backward top_half_len times
基本上,它将列表分为小于或等于中位数的部分(小半部分)和大于中位数的部分(大半部分)。然后,它在这两个半边上都叫自己。一旦它们的长度为1,算法就完成了,因为1长度的列表被排序。谷歌快速排序的实际解释
我想这应该行得通,但我可能错过了一些边缘案例。不要盲目地遵循这一点。另外,如果您处理的是数组,我建议您在某个递归深度停止快速排序,并使用堆排序(或某种防止最坏情况O(n^2)复杂性的方法),但我不确定在这里什么是有效的更新:根据Peter Cordes的说法,当小于某个数组大小时,应该使用插入排序(在我看来,也应该在某个递归深度)
显然,合并排序在链表上更快。修改它来实现合并排序可能不会太难。合并排序与快速排序非常相似。
问题语句缺少比较函数,因此我将定义compare(lista,listb)来比较lista的第一个节点与listb的第一个节点,并返回-1,因为您可以使用这些操作进行非常有效的合并排序。因此我应该将列表1的一半放在列表2中,然后同时对两个列表进行排序并将它们合并?我认为某种快速排序或合并排序是最好的选择。但是,存储未使用的节点将有点棘手。问题陈述不包括允许的比较操作。我假设pa相当于peek_front(列表1)、pop_front(列表1)、push_front(列表2)?是的,在qsort或mergesort的递归实现中,如果(非常感谢它的帮助,我一定要尝试这个方法),您会做
-
-