2017-10-19 96 views
0

当我执行程序时出现错误的输出,我不知道可能是什么原因造成的。插入排序的错误输出

正如你可以在下面我有一个数组。然而在执行程序时,我得到的输出:

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

请学习如何调试程序(例如[如何调试小方案](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/))。您应该学习如何使用调试器,和/或添加打印语句来识别错误。在SO上,您应该提供一些样本输入数据以及预期和实际输出(阅读如何创建MCVE - [MCVE])。 –

+1

看起来你在移动时覆盖了数组中的元素。调试器是识别这些问题的好工具。 –

+0

如果问题得到解决,请接受答案并收紧问题。您已收到类似的[建议](https://stackoverflow.com/questions/46758008/c-compiler-error-which-i-am-unable-to-locate#comment80461712_46758008)。请参阅[答案被接受时的含义是什么?](https://stackoverflow.com/help/accepted-answer) – BLUEPIXY

回答

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算法比较你实现调试。如果您缩进代码,这样也可以帮助您更轻松地发现这些错误。

+0

啊。谢谢你解决了! – oxodo

1

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

#include <stdlib.h> 

可能会被删除。

对#defined名使用大写字母好得多。例如

#define N 6 

这是难以区分低情况下信l1为代码的读取器。

您应该编写一个通用的排序函数,而不是只能接受固定6个元素的数组的函数。因此函数应该具有两个参数,例如

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

这个循环

1)不接触与索引等于0和1的阵列的元件和2)组被声明因为keyarray[i]是相同的值,所以大于key的所有元素都大于key

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