让我困惑的作业练习:
我们有一个随机顺序的n
整数数组,练习要求我们使用下面指定的方法对它们进行排序。
首先,我们按照两个规则将整数放在行中:
这两个规则用于对数组进行排序。当我们完成应用规则时,我们选择较小的可见整数,一次一个,直到它们被排序。
练习需要使用3个数组:
data[1...n]
,其中包含要排序的数字column[1...n,1...]
number[1..n]
表示每列的整数总数例如,如果
data = [3,2,12,8]
然后column
将是:
column[1,1] = 3
column[2,1] = 2
column[1,2] = 12
column[2,2] = 8
而number
将为[2,2]
我正在尝试制作一个循环(请记住,英语中的伪代码可能与我用自然语言学习的伪代码不同)
for counter=1 to n
number[counter]:=0;
end for
for counter=1 to n
a := 1;
b := 1;
if data[counter] < column[a,number[b]] or number[b]=0 then
number[b] := number[b] + 1;
column[a,number[b]] := data[counter];
else
a:=a+1;
b:=b+1;
end if
end for
但是这段代码有很多错误。有人可以试着解释我的逻辑错误吗?
答案 0 :(得分:0)
由于您不知道最终会使用多少rows
,因此您需要使用可扩展的数据结构来表示rows
,因此请使用列表。其次,由于rows
正在堆叠数字,因此每行应该是一个堆栈。像
List<Stack<Integer>> rows = new ArrayList<Stack<Integer>>();
然后你的算法最终会成为O(n ^ 2)。您将遍历输入并将其添加到行中
for(int i: input){
boolean done = false;
for(int x=0; x < rows.size() && ! done; i++)
if(row.peep() > i){
row.add(i);
done = true;
}
if(!done)
row.add(i);
}
完成行填充后,下一步是读回整数。你应该可以从这里拿走它。