是否可以仅使用一个循环实现冒泡排序? (不递归)

时间:2015-02-26 23:45:27

标签: java python algorithm

我试图实现的是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;手动。有人知道这是否可行?

3 个答案:

答案 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
}

这完全没有意义......