似乎无法弄清楚为什么冒泡排序在java中不起作用

时间:2017-10-26 09:08:31

标签: java bubble-sort

public static void main(String[] args) {

    int a[]={13,33,1,32,8,10,11,6};
    bubbleSort(a);


}

public static void bubbleSort(int []a){
int temp=0;
    int n= a.length;
    for(int i=0;i<n;i++ ){

        for(int j=1; j<n-1;j++){  

            if(a[j-1]>a[j]){

                temp=a[j-1];
                a[j-1]=a[j];
                a[j]=temp;

            }
        }System.out.println(a[i]);
    }
}

我似乎没有得到如何设法从算法中随机排序!? 1和8甚至根本没有出现,13显示3次。

结果: 13 13 10 11 13 32 33 6

7 个答案:

答案 0 :(得分:1)

我发现了2个错误。

  • 我删除了你的print语句并把它放在循环之外。
  • 你的第二个循环看起来像这样。 for(int j = 1; j < n - 1; j++){ 我替换了这个代码行。 for (int j = 1; j < (n - i); j++) {

请尝试以下代码。

public class BubbleSort{

   public static void main(String[] args) {

      int a[] = {13, 33, 1, 32, 8, 10, 11, 6};
      bubbleSort(a);

   }

   public static void bubbleSort(int[] a) {
      int temp = 0;
      int n = a.length;

      for (int i = 0; i < n; i++) {
         for (int j = 1; j < (n - i); j++) {
            if (a[j - 1] > a[j]) {
               //swap elements  
               temp = a[j - 1];
               a[j - 1] = a[j];
               a[j] = temp;
            }

         }

      }
      // print array after sorting. 
      for (int i = 0; i < a.length; i++) {
         System.out.print(a[i] + " ");
      }
   }

}

答案 1 :(得分:0)

j应该一直迭代到n(直到n-1)。

变化:

for(int j=1; j<n-1; j++){  

为:

for(int j=1; j<n; j++){  

并且您的冒泡排序将起作用。

答案 2 :(得分:0)

这里有两个主要问题:

  1. 正如@alfasin所说“j应该一直向上迭代直到n(直到n-1)。”

  2. System.out.println应在执行完所有操作后执行,而不是在排序过程中执行。

  3. 以下内容应该有效:

    public class Main {
        public static void main(String[] args) {
            int a[]={13,33,1,32,8,10,11,6};
    
    
            int result[] = bubbleSort(a);
    
            for(int i:result)
                System.out.println(i);  
        }
    
        public static int[] bubbleSort(int []a){
        int temp=0;
            int n= a.length;
            for(int i=0;i<n;i++) {
                for(int j=1; j<n;j++){  
                    if(a[j-1]>a[j]) {
                        temp=a[j-1];
                        a[j-1]=a[j];
                        a[j]=temp;
                    }
                }
            }
            return a;
        }
    }
    

答案 3 :(得分:0)

第二级迭代在应该停止之前停止一步。而你正在错误的阶段打印数组元素。

public static void bubbleSort(int []a){
    int temp=0;
    int n= a.length;
    for(int i=0;i<n;i++ ){
        for(int j=1; j<n;j++){
            if(a[j-1] > a[j]){
                temp=a[j-1]; a[j-1]=a[j]; a[j]=temp;
            }
        }
    }
    for(int i: a) {
        System.out.print(i+" ");
    }
}

答案 4 :(得分:0)

输出不是很有用,因为您在排序过程中正在打印valies。

{{1}}

在结果的末尾使用它。 @alfasin已经指出了另一个错误。

答案 5 :(得分:0)

除了alfashin已经说过的,你的循环应该是n,而不是n-1是你不输出你的最终结果,而是校准步骤i的中间结果:

的System.out.println(A [1]);

确保在完成排序后输出

答案 6 :(得分:0)

除了每个人都提到的两个错误之外,还值得注意的是,关于如何执行冒泡排序的逻辑是次优的。

您正在使用外部for循环,假设您需要执行内循环一致的时间。但实际上这一切都取决于你正在使用的列表。

我将使用此代码的固定版本来演示它:

public static void main(String[] args) {
    int a[] = {13, 33, 1, 32, 8, 10, 11, 6};
    bubbleSort(a);

}

public static void bubbleSort(int[] a) {
    int temp;
    int n = a.length;
    for (int i = 0; i < n; i++) {

        for (int j = 1; j < n; j++) {

            if (a[j - 1] > a[j]) {

                temp = a[j - 1];
                a[j - 1] = a[j];
                a[j] = temp;

            }
        }
    }
    System.out.println(Arrays.toString(a));
}

现在外部for循环运行n次,所以8次。然后你得到一个排序列表作为输出。

[1, 6, 8, 10, 11, 13, 32, 33]

但如果运行次数少于8次会怎样?通过将n替换为6来尝试。输出:

[1, 6, 8, 10, 11, 13, 32, 33]

相同的结果,这意味着您在已排序的列表上运行两次排序。如果你有一个已经排序的1000个整数的列表,这可能会成为一个问题,因为你将循环1000次,没有任何内容。

来自维基百科:“冒泡排序对大多数其他实现的唯一重要优势是,检测列表有效排序的能力已内置到算法中。当列表已经排序时(最好) -case),冒泡排序的复杂性只有O(n)。“

所以你基本上破坏了使用冒泡排序的唯一原因。

你会想要使用其他类型的循环,祝你好运。