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

时间:2016-04-28 18:37:01

标签: java algorithm sorting

我在大学里得到了这个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 < arraySize; i++) {

            System.out.print("| " + i + " | ");
            System.out.println(myArray[i] + " |");

            System.out.println("----------");

        }

    }

    public static void main(String[] args) {
        ListForSorting list = new ListForSorting();

        list.printArray();

        list.bubbleSort();
        list.printArray();
    }

    public void bubbleSort() {

        for (int i = arraySize - 1; 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 |

谢谢!

2 个答案:

答案 0 :(得分:3)

您的swap功能错误。它应该是这样的:

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 |
----------

如果您想要从最小的数字到最大的数字,只需在if函数中更改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 :(得分:1)

您的代码中遇到的问题最多的是:

  1. 错误交换(最后一行应该颠倒)
  2. 您正在循环整个事件N-1

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

  3. 我将这样的升序冒号排序(在 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;i<n;i++)          // process array
          if (a[i-1]>a[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]<a[i])              // if swap needed
    

    顺便说一下,这里有一些排序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 的事实(如果不是太粗糙)。顺便说一句,这段代码可以进一步优化......