插入排序的输出错误

时间:2017-10-19 20:24:03

标签: c arrays sorting insertion-sort

当我执行程序时输出错误,我不知道可能导致它的原因。

如下所示,我有一个数组。但是在执行程序时,我得到了输出:

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;
  }
}

2 个答案:

答案 0 :(得分: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算法进行比较,那么调试相当简单。如果您缩进代码以便更容易发现这些错误,这也会有所帮助。

答案 1 :(得分:1)

对于初学者来说,程序中既不使用标题<stdlib.h>的声明。所以指令

#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