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