请解释第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();
}
答案 0 :(得分:1)
这种排序方式称为Counting Sort。
&#34;排序&#34;正在这里发生,
10 for(int index=0; index<T ;index++)
11 {
12 arr[scanner.nextInt()]++;
13 }
而不是第15-19行。
此排序适用于以下假设:所有输入值都在0
到arr.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,你已经知道在那种情况下会发生什么)