【问题标题】:C Programming - Insertion Sort in Singly Linked ListC 编程 - 单链表中的插入排序
【发布时间】:2017-10-23 16:44:21
【问题描述】:

我的作业几乎完成了,最后一部分是编写一个函数,通过插入排序对单链表进行排序。我还受到作业的预定义结构和 typedef 的约束:

struct le {
    int value;
    struct le *next;
};

typedef struct le listenelement;
typedef listenelement *list;

那些我无法改变的。插入排序函数必须使用这些参数。如果参数 m 为负数,则列表按降序排序,否则按升序排序。

void sort(int m, list *l);

编辑:

这是我从这里实现答案的尝试。我仍然无法让它工作。我尝试创建一个名为“asc”(用于升序排序的列表)和一个辅助列表“aux”的最终结果的新列表,但我被卡住了..

void sort(int m, list *l){              
    if ((m == 0) || (*l == NULL)) {
        printf("Error.\n");
    } else {
        if (m>0) {
            listenelement head = {0,NULL};              
            list asc = {&head};
            list aux = *l;
            while (aux != NULL) {                       
                int val = aux->value;                                                   
                delete_elem(val,&aux);                                                  
                while ((asc->next != NULL) && ((asc->value)<val)) {         
                    printf("%d\n", (asc->value));                                       
                    asc=asc->next;
                }
                insert(val,&asc);   
                asc = &head;                            
            }
            *l = &head;
        }
    }
}

【问题讨论】:

  • 您认为插入排序算法的哪一部分与单链表不兼容?
  • 这篇文章可能对您想要实现的目标有用。 geeksforgeeks.org/insertion-sort-for-singly-linked-list
  • 你不能在单链表中“旅行”回来,这不正是插入排序需要做的吗?
  • @Vic 会的,谢谢!
  • 你基本上需要一个指向你正在移动的元素的指针(如果你想避免列表开头元素的特殊情况,可能需要一个指向链接指针的指针),以及指向要移动的元素的新位置之前的元素的指针(同样,可能是指向链接指针的指针)。

标签: c sorting linked-list singly-linked-list insertion-sort


【解决方案1】:

插入排序不能在单链表上工作,可以吗?你只能在其中前进。

通常的数组插入排序实现没有精确的类比可以很好地处理单链表,但这并不意味着算法不能应用于这样的清单。您只需要对该算法有更广泛的了解,维基百科characterizes 为:

插入排序迭代,每次重复消耗一个输入元素, 并增长一个排序的输出列表。每次迭代,插入排序 从输入数据中删除一个元素,找到它所属的位置 在排序列表中,并将其插入那里。它重复直到没有 输入元素保留。

请注意,该特征不依赖于您遍历项目的顺序。您被困在插入步骤的通常实现上,其中涉及向后迭代列表以找到插入位置。你实际上可以用你的单链表来做到这一点,从最近到最远的测试每个先前的元素,但这会将整个算法的渐近复杂度更改为 O(N3 )。不好。而且没有必要。

通过从头开始遍历子列表forward找到插入位置有什么问题?这仍然满足算法定义(由 Wikipedia 给出),保持渐近复杂性,并且在一般情况下,它从按排序顺序排列的初始子列表中获得与通常实现一样多的优势。

主要区别在于最佳情况和最坏情况。通常实现的最好情况是元素最初是有序的,最坏的情况是它们最初是相反的。对于迭代前向方法的幼稚实现,这些只是简单地翻转,但是通过链表和仔细实现,这两种情况几乎可以同样好。向后迭代的实现确实对数组有一些额外的实际影响,但这些不适用于链表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-11
    • 2020-06-13
    • 1970-01-01
    • 2013-04-04
    • 2012-12-29
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多