使用链接列表进行插入排序

时间:2014-02-28 16:31:04

标签: c++ linked-list

(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=%ld\n", 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;
}

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

1 个答案:

答案 0 :(得分:0)

您不需要为节点分配任何空间。 Insertion sort的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]不需要移动(所以只需继续外部循环)