我试图实现的是BubbleSort /类似算法,但只有一个循环。 这意味着什么,我想改变这个:
for (i = 0; i < N - 1; i++)
for(j = i+1; j < N; j++)
//code
进入这个:
for (ij = 0; ij < N * (N - 1) / 2; ij++)
i = ?
j = ?
//code
问题是,我需要实现&#39; i&#39;和&#39; j&#39;手动。有人知道这是否可行?
答案 0 :(得分:0)
你可以这样做:
while (ij < N * (N - 1) / 2) {
j = (j + 1) % N;
if (j==0)
i++;
}
我看不到好处
答案 1 :(得分:0)
这是一个while循环版本,但我也没有看到这一点。通常,您可以通过使用指示是否继续的布尔值以及各种if-tests来决定在循环内做什么来将几乎任何东西变成一个循环。如果应用于自然嵌套的循环算法,则结果将比使用多个循环更不易读和维护。
public static void weirdSort(int[] data) {
boolean sortDone = false;
boolean swapDone = false;
if (data.length < 2) {
// Lengths 0 and 1 create special cases, and are already sorted.
return;
}
int i = 0;
while (!sortDone) {
if (data[i] > data[i + 1]) {
swapDone = true;
int temp = data[i + 1];
data[i + 1] = data[i];
data[i] = temp;
}
i++;
if (i == data.length - 1) {
sortDone = !swapDone;
swapDone = false;
i = 0;
}
}
}
答案 2 :(得分:0)
假设您的意思是i+1
,而不是1+1
,代码
for (i = 0; i < N - 1; i++)
for(j = i+1; j < N; j++)
//code
相当于
int k = 2 * N - 1;
for (int ij = 0; ij < N * (N - 1) / 2; ij++) {
int i = (int) Math.floor((k - Math.sqrt(k * k - 8 * ij)) / 2);
int j = i + 1 + ij - (k - i) * i / 2;
//code
}
这完全没有意义......