了解用于排序数组中元素的代码

时间:2016-01-06 09:41:15

标签: java sorting

请解释第15-19行的代码如何帮助实现排序。

public static void main( String[] args ) throws java.io.IOException
{
    FastScanner scanner = new FastScanner(8000000);
    Writer writer = new Writer(System.out);      
    int T = scanner.nextInt();
    int[] arr = new int[1000000];     
    for(int index=0; index<T ;index++)
    {
        arr[scanner.nextInt()]++;
    }

   for( int index = 0; index<1000000 ;index++ )
    {
        for(int j=0;j<arr[index];j++)
        writer.writeln(index);
    }
    writer.flush();
}

2 个答案:

答案 0 :(得分:1)

这种排序方式称为Counting Sort

&#34;排序&#34;正在这里发生,

   10     for(int index=0; index<T ;index++)
   11    {
   12         arr[scanner.nextInt()]++;
   13     }

而不是第15-19行。

此排序适用于以下假设:所有输入值都在0arr.length - 1范围内

读取输入时,与读取值对应的数组的index会递增。

最后,我们将数组从索引0开始循环到arr.length - 1,打印数组的index等于它的读取次数。这发生在第15-19行

   15     for( int index = 0; index<1000000 ;index++ )
   16     {
   17         for(int j=0;j<arr[index];j++)
   18             writer.writeln(index);
   19     }

示例:
输入 1 2, 3, 5, 0, 4, 0, 3, 5

数组看起来像 1 {2, 0, 1, 2, 1, 2}

打印索引发生的时间:0, 0, 1, 2, 3, 3, 4, 5, 5

1 :假设所有输入值都在0到5的范围内。因此,数组的大小为6。

答案 1 :(得分:0)

实际上,没有对数组进行排序,但是打印按排序顺序写入数组的元素。以这个例子为例,我们在数组中输入6个元素(2,3,3,5,8和9),看看每次迭代会发生什么:

T = 6

arr[0] = 0
arr[1] = 0
arr[2] = 1
arr[3] = 2
arr[4] = 0
arr[5] = 1
arr[6] = 0
arr[7] = 0
arr[8] = 1
arr[9] = 1

index=0
j=0; j<0; j++

index=1
j=0; j<0; j++

index=2
j=0; j<1; j++
"2"

index=3
j=0; j<2; j++
"3" "3"

index=4
j=0; j<0; j++

index=5
j=0; j<1; j++
"5"

index=6
j=0; j<0; j++

index=7
j=0; j<0; j++

index=8
j=0; j<1; j++
"8"

index=9
j=0; j<1; j++
"9"

Output: 2 3 3 5 8 9

如您所见,元素按排序顺序打印,但数组本身根本没有排序。 (我没有编写其余的迭代,因为元素等于0,你已经知道在那种情况下会发生什么)