2013-07-02 53 views
0

下面是用于非递减顺序排序数字代码:这句话做什么“while(a [i] - != 0)”?

#include<stdio.h> 
#include<stdlib.h> 
# define size 1000001 
static int a[size]; 
int main() 
{ 
    int t, k, i; 
    scanf("%d", &t); 
    for(i = 0; i < t; i++) 
    { 
    scanf("%d", &k); 
    a[k] += 1; 
    } 
    for(i = 0; i < 1000001; i++) 
    { 
    while(a[i]-- != 0) 
     printf("%d\n", i); 
    } 
    return 0; 
} 

这将是很大的帮助真的,如果有人可以在代码向我解释。我已经通过了代码,我不知道它如何对数字进行排序。在任何地方都没有交换,但仍然可以在C++编辑器中使用。

+2

了解它的第一步 - 正确缩进它。 – Dukeling

+2

这看起来很简单[Counting Sort](https://en.wikipedia。org/wiki/Counting_sort),如果你输入一个大于1000000的值,它会覆盖无辜的记忆。 – Blastfurnace

+0

我会简单地写'while(a [i] - )'而不是'while(a [i] - ! = 0)'。但我个人更喜欢'while(a [i] - > = 0)'。因为在while(a [i] - != 0)时,当输入值具有负整数时,我遇到了无限循环问题。 – thefourtheye

回答

0

递减变量a[i],直到它的0,而每一次

0

没有交换,因为不需要打印出来:数字不存储像往常一样,它采用了巨大的阵列,以纪念其数量已进入:

如果添加数字200,它将存储数组[200] = 1。如果再添加200,那么array [200] = 2。

然后,它按以下方式打印数组:想象你有[0,1,2,1,0,0 ...],所以有一个1,2两个,一个3 ... 所以它只显示1,2,2,3

0

代码对数组a中的每个值进行迭代。数组中的每个值a[i]都在while循环中迭代。 while(a[i]--!=0)检查a [i]的值是否为零。如果没有,则循环体被执行。当控制进入循环体时,递减a [i]值。例如,如果a [i] = 6,则输出将是:

5 
4 
3 
2 
1 
0 
0

考虑i = 0; 然后a[i]--!=0将被执行,直到在a[i]的值不成为zero。当a[i]的值变为zero while循环将终止并且for循环的下一迭代将开始。

2

这个程序没有在数学意义上对数字进行排序,但这并不重要,因为它给了你一个这样做的错觉。

该程序要求t,这将更好地命名为numberOfValues ...您将输入的值的数量。可以将数组a[size]视为size桶值。在你的程序中,这些buckets只是计数器。每个存储桶都有一个数字,从0到大小。当输入值5时,存储桶a[5]的计数增加了。这一直持续到所有桶被设置。

该程序然后通过桶工作。您的大部分存储桶都将为空,但当存储桶非零时(while a[i] != 0 - 暂时忽略丢失的--),存储桶需要“清空”,同时需要考虑其内容。存储桶a[i]包含i元素的计数,因此循环打印的值为i接下来的排序,同时也减少计数(a[i]--)。这一直持续到桶被清空(== 0)并且程序移动到下一个桶。

最后,您的所有存储桶都已清空,排序完成。

+0

@all谢谢,我现在能理解它。 – aelor