我的选择排序有什么问题?

What is wrong with my selection sort?

我的选择排序实现在 j < n-2n-1 或 [=18= 的情况下不起作用]n。我做错了什么?

是否有在线 IDE 让我们监视控制回路?

#include <stdio.h>
#define n 4
int main(void) {
    int a[n]={4,3,2,1};
    int j,min;
    for(int i=0;i<n;i++){
        min=i;
        for(j=i+1;j<n-3;j++)
            if(a[j]>a[j+1])
                min=j+1;
        if(min!=i){
            int t=a[min];
            a[min]=a[i];
            a[i]=a[t];
        }
    }

    for(int i=0;i<n;i++)
        printf("%d",a[i]);
    return 0;
}

I tried it here

你的代码确实对 n-3 有一个奇怪的限制,但它也有一些其他的缺陷:

  • 要找到最小值,您应该与当前最小值 (a[min]) 进行比较,而不是数组中的 next/previous 元素
  • 要交换的代码不正确:最后的赋值不应来自 a[t],而是 t 本身。

这是更正后的代码:

int main(void) {
    int a[n]={4,3,2,1};
    int j,min;
    for(int i=0;i<n;i++){
        min=i;
        for(j=i+1;j<n;j++)
            if(a[min]>a[j])
                min=j;
        if(min!=i){
            int t=a[min];
            a[min]=a[i];
            a[i]=t;
        }
    }

    for(int i=0;i<n;i++)
        printf("%d",a[i]);
    return 0;
}

https://ideone.com/AGJDPS

注意:要在在线 IDE 中查看中间结果,为什么不在循环内添加 printf 调用?当然,对于较大的代码项目,您最好使用本地安装的具有所有调试功能的 IDE,并单步执行代码。