如何通过将颜色更改为红色来显示正在排序的行?

时间:2019-05-13 12:56:10

标签: java processing bubble-sort

我已经完成了气泡排序过程的可视化。我自己的下一个步骤是希望能够通过将其颜色更改为红色来查看正在排序的行。我不确定该怎么做,任何见解都会有所帮助。

我尝试将笔画添加到switch算法的中间,并将其放入也可以检查值的算法中,但这两个都不起作用。

float[] lines;
int i = 0;
int j = 0;

void setup() {
  //fullScreen(P2D);
  size(800,500);
  //get array of x values
  lines = new float[width];
  float len = lines.length;
  //populate each x value with a random y value 
  for (int i = 0; i < len; i++) {
    lines[i] = random(height);
  }
}    
void draw() {
  background(0);
  float len = lines.length;
  //do this for the entire array 
  if (i < len) {
     for (j = 0; j < len-i-1; j++) {
      float a = lines[j];
      float b = lines[j + 1];
      if (a > b) {
        swap(lines, j, j+1);
      }
    }
  } else {
    noLoop();
    i++;
  }

  for (int i = 0; i < len; i++) {
    stroke(255);
    line(i, height, i, height - lines[i]);
  }

}

void swap(float[] arr, int a, int b) {
  float temp;
  temp = arr[a];
  arr[a] = arr[b]; 
  arr[b] = temp;
}

这是现在的工作代码,没有将颜色更改为红色,我提供了完整的程序,因此您可以自己尝试一下,看看是否可以帮助更改正在移动并交换为红色的单行。

1 个答案:

答案 0 :(得分:2)

使用IntList来收集已交换的行的索引:

例如

IntList swapped = new IntList();
if (a > b) {
    swapped.append(j);
    swapped.append(j+1);
    swap(lines, j, j+1);
}

如果列表中包含行的索引,则以另一种颜色绘制该行:

例如

for (int i = 0; i < len; i++) {
    if ( swapped.hasValue(i) )
        stroke(255, 0, 0);
    else
        stroke(255);
    line(i, height, i, height - lines[i]);
}

函数draw可能看起来像这样:

void draw() {
    background(0);

    IntList  swapped = new IntList();

    float len = lines.length;
    //do this for the entire array 
    if (i < len) {
        for (j = 0; j < len-i-1; j++) {
            float a = lines[j];
            float b = lines[j + 1];
            if (a > b) {
                swapped.append(j);
                swapped.append(j+1);
                swap(lines, j, j+1);
            }
        }
    } else {
        noLoop();
        i++;
    }

    for (int i = 0; i < len; i++) {
        if ( swapped.hasValue(i) )
            stroke(255, 0, 0);
        else
            stroke(255);
        line(i, height, i, height - lines[i]);
    }
}