我的程序与“选择排序”有什么关系?

时间:2019-08-31 07:17:08

标签: c

这是一本教科书的示例。但是当我验证程序时,我发现书中的答案是错误的。我找不到正确的代码位置。 谢谢您的帮助!

我已经运行了代码。没有语法错误。

#include<stdio.h>

int main() {
    int a[10], i, j, k, x;

    printf("Input 10 numbers:\n");
    for (i = 0; i < 10; i++) {
        scanf("%d", &a[i]);
    }

    printf("\n");
    for (i = 0; i < 9; i++) {
        k = i;
        for (j = i + 1; j < 10; j++) {
            if (a[j] < a[k]) {
                k = j;
            }
            if (i != k) {
                x = a[i];
                a[i] = a[k];
                a[k] = x;
            }
        }
    }

    printf("the sorted numbers:\n");
    for (i = 0; i < 10; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
} 

输出错误。

例如: 输入10个数字: 1 3 2 4 6 5 7 8 11 9

排序数字: 1 3 2 4 5 6 7 8 9 11

2 个答案:

答案 0 :(得分:1)

问题是交换检查在错误的位置。它在内部循环中,但必须在内部循环之后(但在外部循环内部)。代码的排序部分应为:

for(i=0; i<9; i++){
  k=i;
  for(j=i+1; j<10; j++){
    if(a[j]<a[k]){
      k=j;
    }
  }
  if(i!=k){
    x=a[i];
    a[i]=a[k];
    a[k]=x;
  }
}

请注意,if(i!=k)检查现在位于内部循环之后,而不是内部循环。

使用以下输入:

Input 10 numbers:
1 3 2 4 6 5 7 8 11 9

它现在产生:

the sorted numbers:
1 2 3 4 5 6 7 8 9 11 

答案 1 :(得分:0)

正确缩进代码后,很明显:if (i != k) {...被放置在循环内。把它放高一点。

请采用良好的编码风格(有很多)并坚持下去。您将了解到正确缩进会发现多少错误。