使用链表进行插入排序

Insertion sort using linked list

本文关键字:插入排序 链表      更新时间:2023-10-16

(1)您将仅实现插入排序,(2)您将使用链接列表来存储长整数,而不是使用数组进行存储。因此,您的排序必须在链表上执行。

我的代码如下。

Node *Insertion_Sort(Node *sublist) {
//Initialize`enter code here`
Node *dummy_node = malloc(sizeof(Node));
dummy_node->next = NULL;
Node *prev_node = sublist;
Node *curr_node = sublist->next;
Node *head = prev_node;
Node *temp_node = malloc(sizeof(Node));
while(curr_node->next != NULL){
    if (prev_node->value < curr_node->value) {
        //advance the pointers
        prev_node = curr_node;
        if (curr_node != NULL) {
            curr_node = curr_node->next;
            printf("Advancing prev=%ld curr=%ldn", prev_node->value, curr_node->value);
        }
        else
        {
            break;
        }
    }
    else
    {
        //swap
        temp_node = curr_node;
        prev_node->next = curr_node->next;
        curr_node->next = prev_node;
        // Advance
        prev_node = curr_node;
        curr_node = curr_node->next;
        head = prev_node;
    }
}
//curr_node->next  = NULL;
return head;
}

但它只是部分工作。有人可以帮助我吗?

您不需要为节点分配任何空间。用于插入排序的 Wiki 链接。您可能应该使用第二个伪代码示例(其中 i 之前的部分被排序,并且您通过删除和插入节点插入到排序的部分):

for i ← 1 to length(A)
    x ← A[i]
    j ← i
    while j > 0 and A[j-1] > x
        A[j] ← A[j-1]
        j ← j - 1
    A[j] ← x

替换内部 while 循环以仅扫描需要插入 A[i] 的位置。请注意,如果 A[i] 大于所有排序列表,则内部循环不会迭代,j == i 和 A[i] 不需要移动(因此只需继续外部循环)。