改进冒泡排序,有时候工作,有时它不会

时间:2017-02-10 21:33:16

标签: java sorting

这是我使用boolean改进冒泡排序的代码。

import java.util.Scanner;

class BubbleSort {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        int[] array = new int[5];
        int temp;
        boolean swap;
        int count = 0;
        for(int i = 0 ; i < array.length ; i++) {
            System.out.println("Enter a number!");
            array[i] = s.nextInt();
        }
        for(int i = 0 ; i<array.length-1; i++) {
            swap = false;
            for(int j = i + 1 ; j < array.length ; j++) {
                count++;
                if(array[i] > array[j]) {
                    temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                    swap = true;
                }
            }
            if(!swap) {
                break;
            }
        }
        for(int i = 0 ; i < array.length ; i++) {
            System.out.println(array[i]);
        }
        System.out.println();
        System.out.println(count);
    }
}

这段代码有时会为我排序,但有时却没有。

我使用count来查找计算机进行了多少比较,所以我知道我使用的是改进的冒泡排序,而不是简单的冒充。

首先,我要求用户输入五个数字进行排序。

如果数字是:5 4 3 2 1

排序后的列表为1 2 3 4 5,它显示的比较次数为10

如果数字是:1 2 3 4 5

排序列表为1 2 3 4 5,比较为4(这也是正确的,因为它只有4次比较)。

BUT

如果用户输入:1 3 2 4 5

排序列表为1 3 2 4 5(未更改),比较次数为4

所以它没有交换3和2。

我的代码出了什么问题? 是因为当我比较1和3时,for循环中断了吗?

2 个答案:

答案 0 :(得分:1)

  

我的代码出了什么问题?

问题是swap变量以及当您将单个元素与以下所有内容进行比较并且从不交换时,您将突破外部循环这一事实。

在您提供的示例中:1,3,2,4,5 外部循环以1运行,因为它是swap从未设置为true的最小值,逻辑在到达下一个元素(3)之前就已断开。

固定代码(只需删除&#34;改进&#34;):

    Scanner s = new Scanner(System.in);
    int[] array = new int[5];
    int temp;
    int count = 0;
    for(int i = 0 ; i < array.length ; i++)
    {
        System.out.println("Enter a number!");
        array[i] = s.nextInt();
    }
    for(int i = 0 ; i<array.length; i++)
    {
        for(int j = i + 1 ; j < array.length ; j++)
        {
            count++;
            if(array[i] > array[j])
            {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    for(int i = 0 ; i < array.length ; i++)
    {
        System.out.println(array[i]);
    }
    System.out.println();
    System.out.println(count);

注意:正如我在上面的评论中写的那样,这不是冒泡排序,因为冒泡排序会交换两个相邻的元素,如果它们的顺序错误,而这里的比较是在array[i]array[j]不一定相邻。

答案 1 :(得分:0)

内循环上的for循环条件不正确。数组比较和交换逻辑也是错误的。正如评论中所提到的,您的代码没有进行冒泡排序。

<强>提示:

对于内循环,j应该从0开始并且循环与j < array.length - i - 1一样长。如果array[j]

,则应更换array[j + 1]array[j] > array[j + 1]