【问题标题】:What is wrong with my selection sort?我的选择排序有什么问题?
【发布时间】:2017-05-04 17:17:38
【问题描述】:

在 j 或 n-1 或 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

【问题讨论】:

  • 你能用语言标记你的问题吗(即c)?

标签: algorithm iteration selection-sort


【解决方案1】:

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

  • 要找到最小值,您应该与当前最小值 (a[min]) 进行比较,而不是数组中的下一个/上一个元素
  • 要交换的代码不正确:最后一个分配不应来自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,并逐步执行代码。

【讨论】:

  • 我的问题是,为什么需要 N-3?这是什么意思?
  • 我不明白你为什么这么问,因为我提供了一个解决方案。它没有做你需要的吗?
  • 是的。但是我想了解当它确实有效并且使用 N-3 是正确的时,引擎盖下发生了什么
  • 这是糟糕算法的一个特征:它们有时可能有效,有时无效。 n-3 的问题在于,n-2 和 n-1 的值永远不会被比较。显然,不查看两个输入值的排序算法是不正确的。你可能很幸运,但仍然得到正确的结果。
  • 这正是我正在寻找的答案@trincot 谢谢你的坚持!
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
相关资源
最近更新 更多