请帮我调试我的插入排序程序

时间:2011-09-20 20:21:43

标签: c debugging insertion-sort

我无法弄清楚它出了什么问题。

如果输入:4,56,5,2则显示的输出为:2,4,0,1304。

如果输入:27,54,43,26,2则输出显示为:2,26,0,1304,0

如果输入:34,87,54,4,34,则显示的输出为:4,34,0,1304,0

基本上,只有前两个排序的nos显示在输出中,而在其他地方,1304或0显示任何一组输入。

#include <conio.h>
#include <stdio.h>
void main()
{
  int a[10],b[10];
  int i,size,j,k;
  clrscr();
  printf("please tell how many nos you want to enter");
  scanf("%d",&size);
  printf("Enter the nos");
  for (i=0;i<size;i++)  scanf("%d",&a[i]);
  b[0]=a[0];
  //insertionSort algo ---->
  for (j=1;j<size;j++)
  {
    for (k=j-1;k>=0;k--)
      //handling comparision with b[0]
      if (k==0&&(a[j]<b[0])) {
        b[1]=b[0];
        b[0]=a[j];
      }
    //handling comparison with b[1:size-1]
    if (k>0&&(a[j]<b[k]))   { b[k+1]=b[k]; }
    if (k>=0&&(a[j]>=b[k])) { b[k+1]=b[k]; break; }
  }
  for (i=0;i<size;i++)  printf("%d\n",b[i]);
  getch();
}

2 个答案:

答案 0 :(得分:0)

使用更简单的算法:

  1. 读取数字后,将数组A复制到B以保留原始输入。

  2. 对于升序排序,设置i = 0,j = i + 1

  3. 循环j直到数组结束,如果B [j]&lt; B [i]然后交换这两个数字。

  4. 增加i,设置j = i + 1,转到步骤3.除非i&gt; = size。

  5. 打印数组A和B

  6. 该算法可以在以后优化。

答案 1 :(得分:0)

以下是/* comments */为使您的计划有效的最小变化:

#include <conio.h>
#include <stdio.h>
void main()
{
  int a[10],b[10];
  int i,size,j,k;
  clrscr();
  printf("please tell how many nos you want to enter");
  scanf("%d",&size);
  printf("Enter the nos");
  for (i=0;i<size;i++)  scanf("%d",&a[i]);
  b[0]=a[0];
  //insertionSort algo ---->
  for (j=1;j<size;j++)
    for (k=j-1;k>=0;k--)
    { /* the inner loop must contain all the if statements */
      //handling comparision with b[0]
      if (k==0&&(a[j]<b[0])) {
        b[1]=b[0];
        b[0]=a[j];
        break;  /* done; don't mess with b[0+1] below */
      }
      //handling comparison with b[1:size-1]
      if (k>0&&(a[j]<b[k]))   { b[k+1]=b[k]; }
      if (k>=0&&(a[j]>=b[k])) { b[k+1]=a[j]; break; }  /* =a[j] */
    }
  for (i=0;i<size;i++)  printf("%d\n",b[i]);
  getch();
}