【问题标题】:Wrong output from insertion sort插入排序的错误输出
【发布时间】:2017-10-19 20:24:03
【问题描述】:

我在执行程序时得到了错误的输出,我不知道是什么原因造成的。

正如您在下面看到的,我有一个数组。但是,在执行程序时,我得到了输出:

array[0]=3
array[1]=1
array[2]=1
array[3]=5
array[4]=5
array[5]=8

显然,这不是我的预期输出,即 {1,3,4,5,7,8}。我做错了什么?

#include <stdio.h>
#include <stdlib.h>
#define l 6

void isnertionSort(int array[]);

int main(void)
{
  int array[l]={3,4,1,7,5,8};

  for(int i=0; i<l;i++) {
    printf("array[%d]=%d\n", i, array[i]);
  }
  printf("\n");

  isnertionSort(array);

  for(int i=0; i<l; i++){
    printf("array[%d]=%d\n", i, array[i]);
  }

  return 0;
}


void isnertionSort(int array[])
{
  int j,key;
  for(int i =1;i<l;i++){
    key = array[i];

    j = i -1;

    while(j>0 && array[j]>key){
      array[j+1]=array[i];
      j--;//j=j-1                                                                                                  

    }
    array[j+1]= key;
  }
}

【问题讨论】:

  • 请学习如何调试程序(例如How to debug small programs)。您应该学习如何使用调试器逐步完成,和/或添加打印语句来识别出了什么问题。在 SO 上,您应该提供一些示例输入数据以及预期和实际输出(了解如何创建 MCVE — minimal reproducible example)。
  • 移动时似乎覆盖了数组中的元素。调试器是识别此类问题的绝佳工具。
  • 如果问题已解决,请接受答案并收紧问题。您已经收到类似的advice。见What does it mean when an answer is "accepted"?
  • 请注意,使用宏 l(小写字母 L)通常不是一个好主意。尽管拼写错误是一致的,但isnertion 通常拼写为insertion

标签: c arrays sorting insertion-sort


【解决方案1】:

您的内部循环有两个小错误。

while(j >= 0 && array[j]>key) { /* j> 0 changed to j>=0 */
    array[j+1]=array[j];  /* changed from i to j */
    j--;
}

如果您将您的实现与insertion sort 算法进行比较,调试起来相当简单。如果您缩进代码也会有所帮助,这样可以更容易地发现这些错误。

【讨论】:

    【解决方案2】:

    对于初学者来说,程序中没有使用来自标题&lt;stdlib.h&gt; 的声明。所以指令

    #include <stdlib.h>
    

    可能会被删除。

    #defined 名称最好使用大写字母。例如

    #define N 6
    

    代码的读者很难区分小写字母l1

    您应该编写一个通用的排序函数,而不是一个可以接受只有固定 6 个元素的数组的函数。所以函数应该声明两个参数,例如

    void isnertionSort( int array[], size_t n );
    

    这个循环

    while(j>0 && array[j]>key){
      array[j+1]=array[i];
      j--;//j=j-1                                                                                                  
    
    }
    

    1) 不触及索引等于 0 和 1 的数组元素和 2) 将所有大于 key 的元素设置为 key,因为 keyarray[i] 是相同的值。

    array[j+1]=array[i];
               ^^^^^^^^
    

    考虑到所有这些,程序可以如下所示

    #include <stdio.h>
    
    #define N   6
    
    void isnertionSort( int array[], size_t n );
    
    int main(void) 
    {
        int array[N] ={ 3, 4, 1, 7, 5, 8 };
    
        for ( size_t i = 0; i < N; i++ )
        {
            printf( "array[%zu] = %d\n", i, array[i] );
        }
        putchar( '\n' );
    
        isnertionSort( array, N );
    
        for ( size_t i = 0; i < N; i++ )
        {
            printf( "array[%zu] = %d\n", i, array[i] );
        }
        putchar( '\n' );
    
        return 0;
    }
    
    void isnertionSort( int array[], size_t n )
    {
        for( size_t i = 1; i < n; i++ )
        {
            size_t j = i;
            int value = array[i];
    
            for ( ; j != 0 && value < array[j-1]; --j ) 
            {
                array[j] = array[j-1];
            }
    
            if ( j != i ) array[j] = value;         
        }
    }
    

    程序输出是

    array[0] = 3
    array[1] = 4
    array[2] = 1
    array[3] = 7
    array[4] = 5
    array[5] = 8
    
    array[0] = 1
    array[1] = 3
    array[2] = 4
    array[3] = 5
    array[4] = 7
    array[5] = 8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      相关资源
      最近更新 更多