C排序算法没有输出正确的值?

C排序算法没有输出正确的值?,c,arrays,algorithm,sorting,cs50,C,Arrays,Algorithm,Sorting,Cs50,这里是C的新成员。我正在制作一个程序,为学习目的对随机整数列表进行排序和搜索,并尝试实现冒泡排序,但在调试过程中,我的控制台中得到了奇怪的结果 我有这样一个数组: arr[0] = 3 arr[1] = 2 arr[2] = 1 所以,如果我要把这个列表从最小到最大排序,它应该是相反的顺序。相反,我的排序函数似乎在逻辑上有缺陷,并输出以下内容 arr[0] = 0 arr[1] = 1 arr[2] = 2 很明显,我是新来的,因为一个更了解我的人可能会很快发现我的错误 查找.c 助手 数组

这里是C的新成员。我正在制作一个程序,为学习目的对随机整数列表进行排序和搜索,并尝试实现冒泡排序,但在调试过程中,我的控制台中得到了奇怪的结果

我有这样一个数组:

arr[0] = 3
arr[1] = 2
arr[2] = 1
所以,如果我要把这个列表从最小到最大排序,它应该是相反的顺序。相反,我的排序函数似乎在逻辑上有缺陷,并输出以下内容

arr[0] = 0
arr[1] = 1
arr[2] = 2
很明显,我是新来的,因为一个更了解我的人可能会很快发现我的错误

查找.c

助手


数组0..n-1中可以交换的最高项为n-2和n-1。所以i可能不大于n-2,所以i+1访问n-1

因此,您的支票必须是:

if (i > n - 2)

数组0..n-1中可以交换的最高项为n-2和n-1。所以i可能不大于n-2,所以i+1访问n-1

因此,您的支票必须是:

if (i > n - 2)

问题是,如果i>=n-1,则在进行测试之前进行比较和交换。这意味着当i==n-1时,它将比较值[i]>值[i+1],因此它将访问数组边界之外的值,这是未定义的行为。在您的例子中,数组后面的内存中恰好有0,因此这被交换到数组中,然后它被排序到数组的开头

改变

    if (values[i] > values[i+1])


问题是,如果i>=n-1,则在进行测试之前进行比较和交换。这意味着当i==n-1时,它将比较值[i]>值[i+1],因此它将访问数组边界之外的值,这是未定义的行为。在您的例子中,数组后面的内存中恰好有0,因此这被交换到数组中,然后它被排序到数组的开头

改变

    if (values[i] > values[i+1])



您真的需要提供自己的sort实现吗?C在您的调试器中对程序进行了一步调试,并在调试过程中检查变量的值。@CodeDifferent他显然在尝试学习算法。@Barmar您好,我已经这样做了,但对如何使用0感到有点困惑:显然,我的输出实际上非常接近它应该是什么,只是似乎有1个数字的地方。我已经调整了一些条件,但似乎仍然会出现这个问题。@CodeDifferenting我很感激您的回答,但这纯粹是出于教育目的。您真的需要提供自己的排序实现吗?C在您的调试器中对程序进行了一步调试,并在调试过程中检查变量的值。@CodeDifferent他显然在尝试学习算法。@Barmar您好,我已经这样做了,但对如何使用0感到有点困惑:显然,我的输出实际上非常接近它应该是什么,只是似乎有1个数字的地方。我已经调整了一些条件,但似乎仍然出现了这个问题。@code我很感激您的回答,但这纯粹是出于教育目的。if>n-1中的代码块从不进行任何交换,因此这不是问题。它要么打破循环,要么设置i=0。是的,刚刚尝试了这个解决方案,似乎是合法的。但是得到了相同的输出。废话@保罗Ogilvie@Barmar,问题是else i++;David,在输入之后和排序之前打印数组;然后排序,然后再次打印。我看不出排序还有什么问题。@PaulOgilvie会这么做,但我只想说我做了检查I>n-3,它输出了正确的结果。我真的很困惑为什么,但这一定是问题所在。if>n-1中的代码块从不进行任何交换,所以这不是问题。它要么打破循环,要么设置i=0。是的,刚刚尝试了这个解决方案,似乎是合法的。但是得到了相同的输出。废话@保罗Ogilvie@Barmar,问题是else i++;David,在输入之后和排序之前打印数组;然后排序,然后再次打印。我看不出排序还有什么问题。@PaulOgilvie会这么做,但我只想说我做了检查I>n-3,它输出了正确的结果。我真的不明白为什么,但这一定是问题所在。@PaulOgilvie我已经更改了我的答案,请看一看。@Barmar我发誓我以为我已经尝试将AND条件添加到第一次检查中,得到了相同的结果,但只是再次尝试,我得到了正确的输出。我将继续并将此标记为答案。非常感谢。接得好,巴尔马!最好将cmp/交换移到else部分。@PaulOgilvie可能有更好的方法来重构它,但我想把我的更改保持在最低限度。是的,我这么认为。这可能更像是给OP的一张便条,而不是给你的。这样你就更清楚了。@PaulOgilvie我已经更改了我的答案,请看一看。@Barmar我发誓我本以为我已经尝试将AND条件添加到第一次检查中,得到了相同的结果,但只是再次尝试,我得到了正确的输出。我要走了
前进,并将此标记为答案。非常感谢。接得好,巴尔马!最好将cmp/交换移到else部分。@PaulOgilvie可能有更好的方法来重构它,但我想把我的更改保持在最低限度。是的,我这么认为。这可能更像是给OP的一张便条,而不是给你的。这样你就把问题说得更清楚了。
    if (i < n-1 && values[i] > values[i+1])