我计划进行排序马拉松,我会查找常见排序算法的伪代码,并尝试用Java实现它们。
我尝试的第一个是bubblesort。我写了最简单的表格似乎工作正常:
package bubblesort;
public class Sort {
private static void swapElements(int[] array, int index1, int index2) {
int holder = array[index1];
array[index1] = array[index2];
array[index2] = holder;
}
public static void ascending(int[] array) {
boolean sorted = false;
while(!sorted) {
sorted = true; //if no elements are swapped, 'sorted' remains equal to true and the while-loop ends.
for(int i = 0; i < array.length - 1; i++) {
if(array[i] > array[i + 1]) {
swapElements(array, i, i + 1);
sorted = false;
}
}
}
}
}
然而,由于每次执行for循环时最高值都被带到最后一个元素,我试图通过在结尾省略元素来改进它,引入一个新变量来计算整个数组的次数。检查:
package bubblesort;
public class Sort {
private static void swapElements(int[] array, int index1, int index2) {
int holder = array[index1];
array[index1] = array[index2];
array[index2] = holder;
}
public static void ascending(int[] array) {
int timesLooped = 0;
boolean sorted = false;
while(!sorted) {
sorted = true;
for(int i = 0; i < array.length - timesLooped - 1; i++) {
if(array[i] > array[i + 1]) {
swapElements(array, i, i + 1);
sorted = false;
}
timesLooped++;
}
}
}
}
这次排序失败;只有阵列中的某些元素被排序,其他元素不会被排除。
所以我的问题是:我介绍&#39; timesLooped&#39;的方式有什么问题?试图避免进行不必要的比较的变量?
答案 0 :(得分:3)
timesLopped++
应位于for
循环之外:
public static void ascending(int[] array) {
int timesLooped = 0;
boolean sorted = false;
while(!sorted) {
sorted = true;
for(int i = 0; i < array.length - timesLooped - 1; i++) {
if(array[i] > array[i + 1]) {
swapElements(array, i, i + 1);
sorted = false;
}
}
timesLooped++;
}
}