C 使用有限的操作集对50000个数字的2个链表进行排序

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(最后一

所以我有一个学校项目:我有一个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(最后一个变为第一个)

  • “rrr”:“rra”和“rrb”同时出现

我必须用c语言实现一个排序算法,目标是用最少的指令量来实现。
我尝试了一个非常简单的算法,旋转列表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的递归实现中,如果(非常感谢它的帮助,我一定要尝试这个方法),您会做

-
-