(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;
}
但它只是部分工作。有人能帮助我吗?
答案 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]不需要移动(所以只需继续外部循环)