我在Java中的冒泡排序算法永远不会停止排序,也不会返回任何内容

时间:2017-11-13 08:56:16

标签: java algorithm sorting

我试图在Java中制作一个冒泡排序算法但是我的代码只是在它应该排序而不返回任何内容时继续运行。当程序运行时,它会在排序之前打印数组,但之后没有任何反应,但程序没有停止它继续运行

package src;
import java.util.Scanner;
import java.util.Random;
import java.util.ArrayList;
import java.util.List;

public class bubbleSort {

    public static void main(String[] args) {

        int length = getLength();

        List<Integer> randomList = createList(length);

        System.out.println("The list before sorting:\n" + randomList);

        List<Integer> newList = sortList(randomList, length);

        System.out.println("The list after sorting:\n" + newList);



    }

    public static int getLength() {
        System.out.println("Please enter how long you want the array to be");

        Scanner reader = new Scanner(System.in);

        int length = Integer.parseInt(reader.nextLine());

        return length;
    }

    public static List<Integer> createList(int length) {
        Random rand = new Random();

        List<Integer> randomList = new ArrayList<Integer>();

        for(int x = 0 ; x < length ; x++){
            int randomnumber = rand.nextInt((100 - 1) + 1) + 1;
            randomList.add(randomnumber);
        }

        return randomList;  
    }

    public static List<Integer> sortList(List<Integer> randomList, int length){
        boolean sorted = false;

        while(sorted == false){
            sorted = true;

            for(int x = 0 ; x < (length - 1) ; x++) {
                if(randomList.get(x) > randomList.get(x + 1)) {
                    sorted = false;
                    int temp = randomList.get(x + 1);
                    randomList.set((x + 1), (x));
                    randomList.set((x + 1), temp);
                }
            }
        }

        return randomList;
    }

}

2 个答案:

答案 0 :(得分:1)

创建一个交换方法,使其更清晰(对我们和您自己而言):

private void swap(List<Integer> values, x, y) {
    int temp = values.get(x);
    values.set(x, values.get(y));
    values.set(y, temp);
}

其他建议:

  • 为您的班级BubbleSort而不是bubbleSort命名。类名称约定以大写字母开头。
  • 不要将长度作为第二个参数传递给sort方法。如果有人悄悄地将一个项目添加到列表中,那么这是多余的,可能会变得不正确。
  • randomList重命名为valuesnumbersrandomNumbers。无需重复变量名称中的类型。
  • sorted == false替换为!sorted。这是常见且更易读的符号
  • getLengthcreateList可以是私有的
  • 考虑使用main方法创建排序类的实例,将列表作为字段。这样,方法就不必将列表相互传递。您的代码将更易读,更面向对象。

编辑:您可以进一步分离并将所有静态方法移动到一个名为“Application”或“Main”的单独类中。请参阅以下编辑代码:

以下是我的建议后代码的大致情况:

public class BubbleSort {    

    // a field
    private List<Integer> numbers;

    public BubbleSort(List<Integer> numbers) {
        this.numbers = numbers;
    }

    public static List<Integer> sort() {
        boolean sorted = false;
        while(!sorted) {
            sorted = true;
            for(int x = 0; x < length - 1; x++) {
                if(numbers.get(x) > numbers.get(x + 1)) {
                    sorted = false;
                    swap(x, x + 1);
                }
            }
        }     
        return numbers;
    }       

    private void swap(x, y) {
        int temp = numbers.get(x);
        numbers.set(x, numbers.get(y));
        numbers.set(y, temp);
    }

}

Application类。它的目的是从用户获取长度,创建测试数据并设置和调用BubbleSort实例:

public class Application {

    public static void main(String[] args) {

        int length = getLength();
        List<Integer> unsorted = createList(length);
        System.out.println("The list before sorting:\n" + unsorted);

        // creating an instance of the BubbleSort class
        BubbleSort bubbleSort = new BubbleSort(unsorted );        
        List<Integer> sorted = bubbleSort.sort();

        System.out.println("The list after sorting:\n" + sorted);
    } 

    private static int getLength() {
        System.out.println("Please enter how long you want the array to be");
        Scanner reader = new Scanner(System.in);
        return Integer.parseInt(reader.nextLine());
    }

    private static List<Integer> createList(int length) {
        Random rand = new Random();
        List<Integer> numbers = new ArrayList<Integer>();
        for(int x = 0 ; x < length ; x++){
            int randomnumber = rand.nextInt((100 - 1) + 1) + 1;
            numbers.add(randomnumber);
        }
        return numbers;   
    }

顺便说一句好的工作分开了getLengthcreateList这些方法。这是正确的想法。

答案 1 :(得分:-1)

你犯了几个错误

这个:

randomList.set((x + 1), (x));
randomList.set((x + 1), temp);

应该是:

randomList.set((x + 1), randomList.get(x));
randomList.set((x), temp);

完整方法:

public static List<Integer> sortList(List<Integer> randomList, int length){
    boolean sorted = false;

    while(sorted == false){
        sorted = true;

        for(int x = 0 ; x < (length - 1) ; x++) {
            if(randomList.get(x) > randomList.get(x + 1)) {
                sorted = false;
                int temp = randomList.get(x + 1);
                randomList.set((x + 1), randomList.get(x));
                randomList.set((x), temp);
            }
        }
    }

    return randomList;
}