如何调试我的冒泡排序代码?

我在大学里得到了这个bubort,我正试图运行它! 它应该按照大小,从最小到最大的顺序对数字进行排序。 任何帮助,将不胜感激。 (它来自YouTube上的Derek Banas)。 你知道为什么它不起作用吗?

public class ListForSorting { int arraySize = 10; int[] myArray = { 10, 12, 3, 4, 50, 60, 7, 81, 9, 100 }; public void printArray() { System.out.println("----------"); for (int i = 0; i  1; i--) { for (int j = 0; j < i; j++) { if (myArray[j] < myArray[j + 1]) swap(j, j + 1); } } } public void swap(int indexOne, int indexTwo) { int temp = myArray[indexOne]; myArray[indexOne] = myArray[indexTwo]; temp = myArray[indexTwo]; } } 

输出:

 ---------- | 0 | 10 | ---------- | 1 | 12 | ---------- | 2 | 3 | ---------- | 3 | 4 | ---------- | 4 | 50 | ---------- | 5 | 60 | ---------- | 6 | 7 | ---------- | 7 | 81 | ---------- | 8 | 9 | ---------- | 9 | 100 | ---------- ---------- | 0 | 81 | ---------- | 1 | 100 | ---------- | 2 | 100 | ---------- | 3 | 100 | ---------- | 4 | 100 | ---------- | 5 | 100 | ---------- | 6 | 100 | ---------- | 7 | 100 | ---------- | 8 | 100 | ---------- | 9 | 100 | 

谢谢!

你的swapfunction错了。 它应该是这样的:

 public void swap(int indexOne, int indexTwo) { int temp = myArray[indexOne]; myArray[indexOne] = myArray[indexTwo]; myArray[indexTwo] = temp; } 

此外, bubblesort函数有错误。 计数器i应该降到1而不是2 ,否则你的第一个元素将不会按照它应该排序:

 public void bubbleSort() { for (int i = arraySize - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (myArray[j] < myArray[j + 1]) swap(j, j + 1); } } } 

现在输出:

 ---------- | 0 | 10 | ---------- | 1 | 12 | ---------- | 2 | 3 | ---------- | 3 | 4 | ---------- | 4 | 50 | ---------- | 5 | 60 | ---------- | 6 | 7 | ---------- | 7 | 81 | ---------- | 8 | 9 | ---------- | 9 | 100 | ---------- ---------- | 0 | 100 | ---------- | 1 | 81 | ---------- | 2 | 60 | ---------- | 3 | 50 | ---------- | 4 | 12 | ---------- | 5 | 10 | ---------- | 6 | 9 | ---------- | 7 | 7 | ---------- | 8 | 4 | ---------- | 9 | 3 | ---------- 

如果你想从最小的数字到最大的数字,只需改变条件在bubblesort函数:

 public void bubbleSort() { for (int i = arraySize - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (myArray[j] > myArray[j + 1]) swap(j, j + 1); } } } 

现在,输出将是:

 ---------- | 0 | 10 | ---------- | 1 | 12 | ---------- | 2 | 3 | ---------- | 3 | 4 | ---------- | 4 | 50 | ---------- | 5 | 60 | ---------- | 6 | 7 | ---------- | 7 | 81 | ---------- | 8 | 9 | ---------- | 9 | 100 | ---------- ---------- | 0 | 3 | ---------- | 1 | 4 | ---------- | 2 | 7 | ---------- | 3 | 9 | ---------- | 4 | 10 | ---------- | 5 | 12 | ---------- | 6 | 50 | ---------- | 7 | 60 | ---------- | 8 | 81 | ---------- | 9 | 100 | ---------- 

编辑:表现

你可以通过“检查”内循环是否至少进行一次交换来加快速度。 如果不是这意味着你可以存在外循环,因为它完成并节省了外循环迭代的其余部分的时间。

你的代码中遇到的问题很少,最有问题的是:

  1. 错误的交换 (最后一行应该颠倒)
  2. 你循环整个事情N-1

    这是不必要的过多循环,直到数组被排序。 所以直到内循环没有发生交换。

我像这样编码升序冒泡排序(在C ++中 ):

 void sort_asc(int *a,int n) { int i,e; for (e=1;e;n--) // loop until no swap occurs for (e=0,i=1;ia[i]) // if swap needed { e=a[i-1]; // swap a[i-1]=a[i]; a[i]=e; e=1; // allow to process array again } } 

用法:

 int a[]={ 9,8,7,6,5,4,3,2,1,0 }; // worse case scenario sort_asc(a,sizeof(a)/sizeof(a[0])); 

降序只是将条件改变为:

  if (a[i-1] 

顺便说一下这里排序32位的一些测量值int a[1024]数组循环100次:

  Time Space [ 1.428 ms] Worse case O(n) [ 312.744 ms] Bubble asc O(n^2) O(1 ) OK [ 306.084 ms] Bubble dsc O(n^2) O(1 ) OK [ 9.883 ms] Quick asc O(n.log(n)) O(log(n)) OK [ 10.620 ms] Quick dsc O(n.log(n)) O(log(n)) OK [ 1.816 ms] Random O(n) [ 374.343 ms] Bubble asc O(n^2) O(1 ) OK [ 361.219 ms] Bubble dsc O(n^2) O(1 ) OK [ 14.402 ms] Quick asc O(n.log(n)) O(log(n)) OK [ 14.519 ms] Quick dsc O(n.log(n)) O(log(n)) OK 

asc和desc排序具有相同的速度,微小的测量差异仅仅是由于CACHE,因为它们都使用相同的内存空间,因此在测试中首先调用一个将更慢,第二个受益于内存在CACHE中映射的事实(如果不是太大的粗糙)。 顺便说一句,这段代码可以进一步优化......