【问题标题】:Java Bubble Sort TroubleJava 冒泡排序问题
【发布时间】:2012-12-06 21:51:01
【问题描述】:

我编写了一个冒泡排序程序,可以将 10000 个唯一值按顺序排序。

我已经运行了这个程序,它给了我一个时间输出(使用 nanoTime)来表示程序完成所花费的时间,但我希望在程序代码中添加另一个输出;程序从开始到结束排序需要多少步。

代码如下:

public class BubbleSort {
public static void main(String[] args) {
    int BubArray[] = new int[]{#here are 10000 integers#};
    System.out.println("Array Before Bubble Sort");
        for(int a = 0; a < BubArray.length; a++){
             System.out.print(BubArray[a] + " ");
        }

         double timeTaken = bubbleSortTimeTaken(BubArray);
            bubbleSort(BubArray);
            System.out.println("");               
            System.out.println("Array After Bubble Sort");
    System.out.println("    Time taken for Sort : " + timeTaken + " milliseconds.");                
            for(int a = 0; a < BubArray.length; a++){
                    System.out.print(BubArray[a] + " ");
        }
}

private static void bubbleSort(int[] BubArray) {

        int z = BubArray.length;
        int temp = 0;

        for(int a = 0; a < z; a++){
                for(int x=1; x < (z-a); x++){

                        if(BubArray[x-1] > BubArray[x]){

                                temp = BubArray[x-1];
                                BubArray[x-1] = BubArray[x];
                                BubArray[x] = temp;

                        }      
                }
        }
}
public static double bubbleSortTimeTaken(int[] BubArray) {
long startTime = System.nanoTime();
    bubbleSort(BubArray);
long timeTaken = System.nanoTime() - startTime;
return timeTaken;
}
}

代码执行并输出我想要的方式:

Array Before Bubble Sort
13981 6793 2662 10986 733 10107 2850 ... 
Array After Bubble Sort
10 11 17 24 35 53 57 60 61 78 83 89 128 131 138 141 ....
Time taken for Sort : 1.6788472E7 milliseconds.

但我希望在代码中添加另一个输出,它告诉我需要完成多少移动(基本上是移动计数器),即:

Time taken for Sort : 1.6788472E7 milliseconds.
Total number of moves: 3000

这有意义吗? 任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 对什么有意义?你为什么对这样的价值观感兴趣?
  • 听起来您需要声明一个变量来跟踪移动次数,并在算法移动一个值时向其添加一个 (++?)。然后你只需要在最后输出那个变量。
  • 顺便问一下,我们给bubbleSort(BubArray);打了两次电话吗?一次在bubbleSortTimeTaken 和一次在main?如果您想获得运行时间,只需从 main 中删除一个调用

标签: java runtime bubble-sort


【解决方案1】:

我会更改 bubbleSort 以返回一个 int 并将您的 time complexity 分配给它。

private static int bubbleSort(int[] BubArray) {

        int z = BubArray.length;
        int temp = 0;

        int itrs = 0;

        for(int a = 0; a < z; a++){
                for(int x=1; x < (z-a); x++){

                        if(BubArray[x-1] > BubArray[x]){

                                temp = BubArray[x-1];
                                BubArray[x-1] = BubArray[x];
                                BubArray[x] = temp;


                        }    

                        itrs++;
                }
        }

        return itrs;

}

然后在main:

int itrs = bubbleSort(BubArray);
            System.out.println("");               
            System.out.println("Array After Bubble Sort");
    System.out.println("    Time taken for Sort : " + timeTaken + " milliseconds.");  
    System.out.println("Time complexity: " + itrs);

【讨论】:

  • "itrs" 我猜你用的是 Integers 的名字?
  • 我很清楚,“时间复杂度”是每次完成的移动次数?如:排序所用时间:3.8208782E7 毫秒。时间复杂度:1447551
  • 哇,你帮了我很多忙!我不知道该怎么感谢你才足够。此问题已得到解答,现在可以关闭。谢谢你的泡沫!
  • 不客气。很高兴有帮助。这是作业吗,顺便说一句?
  • 没错,我一直在努力计算执行键操作的次数。我了解如何实现执行时间,但不是每一步。谢谢!
【解决方案2】:

试试这个:

// returns the number of switches
private int bubbleSort(int[] BubArray) {

        int z = BubArray.length;
        int temp = 0;
        int timesSwitched = 0;
        for(int a = 0; a < z; a++){
                for(int x=1; x < (z-a); x++){

                        if(BubArray[x-1] > BubArray[x]){

                                temp = BubArray[x-1];
                                BubArray[x-1] = BubArray[x];
                                BubArray[x] = temp;
                                timesSwitched++
                        }      
                }
        }
     return timesSwitched;
}

【讨论】:

  • 感谢您的意见,感谢您的帮助和快速响应。虽然fopilpile的回答确实解决了我的问题。
猜你喜欢
  • 2021-07-03
  • 2023-03-07
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多