Prima di tutto, si ha un out-of-bounds accesso:
for(int j=0; j<a.length; j++) {
if(a[j] > a[j+1]) {
per j == a.length-1
, quindi la condizione del ciclo dovrebbe piuttosto essere j < a.length-1
.
Ma, in bubble sort, si sa che dopo k
passaggi, il più grande k
elementi sono ordinati alle ultime k
voci della matrice, in modo convenzionale bubble sort utilizza
public static void bubblesort(int[] a) {
for(int i=1; i<a.length; i++) {
boolean is_sorted = true;
for(int j=0; j < a.length - i; j++) { // skip the already sorted largest elements
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
is_sorted = false;
}
}
if(is_sorted) return;
}
}
Ora, che sarebbe ancora fare un sacco di iterazioni inutili quando l'array ha una lunga coda ordinata di elementi più grandi, diciamo che hai k,k-1,...,1
come i primi elementi e k+1
a 100000000
in seguito. Lo standard Bubble sort passerà k
volte (quasi) all'intero array.
Ma se vi ricordate dove è stato effettuato l'ultimo di swap, si sa che dopo tale indice, ci sono gli elementi più grandi in ordine, in modo
public static void bubblesort(int[] a) {
int lastSwap = a.length-1;
for(int i=1; i<a.length; i++) {
boolean is_sorted = true;
int currentSwap = -1;
for(int j=0; j < lastSwap; j++) {
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
is_sorted = false;
currentSwap = j;
}
}
if(is_sorted) return;
lastSwap = currentSwap;
}
}
sarebbe sorta l'esempio precedente, con un solo passaggio attraverso l'intero array, e il resto passa solo attraverso un prefisso (breve).
Ovviamente, in generale, questo non ti comprerà molto, ma l'ottimizzazione di un Bubble sort è comunque un esercizio piuttosto futile.
Come si può sapere che sono già ordinati? – Pol0nium
ti riferisci a is_sorted? è solo una bandiera – kent
@ Pol0nium: perché un essere umano vede questo. La domanda è come far vedere all'algoritmo che –