Что не так в моей сортировке пузырьков с использованием ArrayList? - PullRequest
0 голосов
/ 13 января 2020

Что не так в моей сортировке пузырьков в ArrayList? Это не было отсортировано. Я новичок.

public static ArrayList < Integer > bubbleSort(ArrayList < Integer > ar) {

    for (int i = 0; i < ar.size() - 1; i++) {
        int indexMax = i;
        for (int j = 1; j < ar.size(); j++) {
            if (ar.get(indexMax) > ar.get(j)) {
                indexMax = j;
            }
        }
        if (indexMax != i) {
            int temp = ar.get(i);
            ar.set(i, ar.get(indexMax));
            ar.set(indexMax, temp);
        }
    }
    return ar;

}

Ответы [ 4 ]

1 голос
/ 13 января 2020

Вы уверены, что должны начинать со 2-го элемента (j=1) каждый раз? Попробуйте j=i. т. е.

public static ArrayList<Integer> bubbleSort (ArrayList<Integer> ar) {
    for (int i = 0; i < ar.size() - 1; i++) {
        int indexMax = i;            
        for (int j = i; j < ar.size(); j++) {
            if (ar.get(indexMax) > ar.get(j)) {
                indexMax = j;
            }
        }
        if (indexMax != i) {
            int temp = ar.get(i);
            ar.set(i, ar.get(indexMax));
            ar.set(indexMax, temp);
        }
    }
    return ar;
}

PS это позволит отсортировать ваш массив в порядке по возрастанию .

0 голосов
/ 13 января 2020

Можете ли вы попробовать это?

int n = arr.length; 
    for (int i = 0; i < n-1; i++) 
        for (int j = 0; j < n-i-1; j++) 
            if (arr[j] > arr[j+1]) 
            { 
                // swap arr[j+1] and arr[i] 
                int temp = arr[j]; 
                arr[j] = arr[j+1]; 
                arr[j+1] = temp; 
            } 
0 голосов
/ 13 января 2020

Вы можете сделать сортировку так:

for(int out=inputArray.size()-1; out>0; out--){
    for(int j=1; j<=out; j++){
      if(inputArray[j-1]<inputArray[j]){
         //Swap the elements
         int temp = inputArray[j];
         inputArray[j]=inputArray[j-1];
         inputArray[j-1]=temp;
       }
     }
 }
return inputArray;
0 голосов
/ 13 января 2020

Ваш блок кода подкачки выглядел так, как если бы он находился за пределами l oop, поэтому произошел только один обмен за одну итерацию основного l oop. Вы также делаете ненужное сравнение элементов, начиная свой внутренний l oop с предусловия j = 1. Вы должны начать его с i, так как после некоторых итераций внешний l oop диапазон от 0 до i будет уже отсортирован.

Я думаю, что вы можете использовать более простой подход.

for (int i = 0; i < ar.size() - 1; i++) {
    for (int j = i; j < ar.size(); j++) {
        if (ar.get(j) < ar.get(i)) {
            Integer temp = ar.get(j);
            ar.set(j, ar.get(i));
            ar.set(i, temp);       
        }
    }
}

Как видите, обмен происходит внутри внутреннего l oop, и он также пропускает уже отсортированную часть коллекции.

...