【问题标题】:Really don't get why my array doesn't sort ascending but descending真的不明白为什么我的数组不是升序而是降序排序
【发布时间】:2020-04-04 14:07:27
【问题描述】:

我是新手。真的不明白为什么它是降序而不是升序,因为我检查数组的每个元素与所有其他元素,如果前者更大,它​​就变成后者,依此类推,所以元素应该慢慢地在顺序,但发生的情况恰恰相反。

#include <stdio.h>

void main(void){
    unsigned int array[7] = {3,1,6,9,0,44,4};

    for (unsigned int i=0; i<=6; ++i){
        for (unsigned int j=0; j<=6; ++j){
            if (array[i] > array[j]){
                int hold = array[j];
                array[j] = array[i];
                array[i] = hold;
            }
        }
    }
    for (unsigned int i=0; i<=6; ++i){
        printf("%4d", array[i]);
    }
}

输出:

  44   9   6   4   3   1

我知道将“>”替换为“

编辑:按照我收到的答案,如果我用“i+1”替换(在内部循环中)那个 0,它会起作用。我会尝试更好地理解原因。

【问题讨论】:

  • 你问的是&gt;&lt;的区别吗?
  • 内循环应该是 for (unsigned int j=i+1; j&lt;=6; ++j) 。一旦第 i 个元素被定位,就不应再次触摸它。您不正确的基于 0 的内部循环将后面的 array[i] 元素与实际上已经排序的较低 array[j] 元素进行比较。
  • @WhozCraig 但是为什么如果我写 j=i 而不是 j=i+1 它的工作原理是一样的?
  • 想想..关于 j=i 的不同之处。 array[n] &lt; array[n] 永远 会是真的吗(当ij 永远相等时,这正是你所拥有的,当j=i 是初始起点时它们就是这样)?不,不会,因此从j=i 开始的内部循环的第一次迭代将始终是无操作的,从不执行交换,因此完全没有意义。因此,为什么j=i+i 是内部循环的正确起点。

标签: c arrays sorting


【解决方案1】:

您已尝试实现Selection Sort。代码大部分是正确的,但是您构建循环的方式存在逻辑缺陷,特别是在您的内部循环覆盖的范围内。在调试器中运行您的代码以查看发生了什么,或尝试向您的橡皮鸭/宠物狗/电脑鼠标详细解释代码在做什么以及为什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2014-10-22
    • 2011-12-02
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多