如何在C中使用此代码使用插入排序对列表进行排序?

时间:2019-03-02 05:26:07

标签: c

订购给定值时遇到一些麻烦。现在,输入文件为:

347 490 950 779 911 825 215 584 355 266 301 458 381 13 577 835

但是我得到了:

835 577 13 381 458 301 266 355 584 215 825 911 779 950 490 347

如何使用Insert()中的代码按升序对它们进行排序?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// Node for building our linked list.
struct NodeTag {
  int value;
  struct NodeTag *next;
};

typedef struct NodeTag Node;

Node *insert( Node *head, int val )
{
  Node *n = (Node *)malloc(sizeof(Node)); 
  n->value = val;
    n->next = head;
      return n;
}

int main()
{
  Node *head = NULL;

  int x;
  while ( scanf( "%d", &x ) == 1 ){
    head = insert( head, x );
  }

  for(Node *n = head; n; n = n->next) {
     printf("%d ", n->value);
  }

  printf("\n");

  while(head) {

   Node *next = head->next;
     free(head);
        head = next;
   }
   return 0;
}

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:4)

您要在列表的开头插入每个元素,因此它们的排列顺序与您阅读它们的顺序相反。那不是插入排序。

当您插入列表时,需要以正确的顺序放置新元素。当找到一个新值大于当前节点的值但小于下一个节点的值的节点时,可以在当前节点和下一个节点之间插入新节点。

如果它小于头节点,则将其设为新头。如果它大于末端节点,则将其放在末端。

答案 1 :(得分:0)

insertion sort

这是同一网页上的示例:

/* Function to sort an array using insertion sort*/
void insertionSort(int arr[], int n) 
{ 
   int i, key, j; 
   for (i = 1; i < n; i++) 
   { 
       key = arr[i]; 
       j = i-1; 

       /* Move elements of arr[0..i-1], that are 
          greater than key, to one position ahead 
          of their current position */
       while (j >= 0 && arr[j] > key) 
       { 
           arr[j+1] = arr[j]; 
           j = j-1; 
       } 
       arr[j+1] = key; 
   } 

}