I would like to know how else I can optimize bubble sort so that it overlooks elements that have already been sorted, even after the first pass.
Eg. [4, 2, 3, 1, 5, 6] --> [2, 3, 1, **4, 5, 6**]
We observe that [4,5,6] are already in sorted order, how can modify my code so that it overlooks this 3 elements in the next pass? (which means the sort would be more efficient?) Do you suggest a recursive method?
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; j++) {
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;
}
}
Thanks for your time!
Optimized bubble sort with just 1 for Loop
First of all, you have an out-of-bounds access:
for
j == a.length-1
, so the loop condition should rather bej < a.length-1
.But, in Bubble sort, you know that after
k
passes, the largestk
elements are sorted at thek
last entries of the array, so the conventional Bubble sort usesNow, that would still do a lot of unnecessary iterations when the array has a long sorted tail of largest elements, say you have
k,k-1,...,1
as the firstk
elements andk+1
to100000000
in order after that. The standard Bubble sort will passk
times through (almost) the entire array.But if you remember where you made your last swap, you know that after that index, there are the largest elements in order, so
would sort the above example with only one pass through the entire array, and the remaining passes only through a (short) prefix.
Of course, in general, that won't buy you much, but then optimising a Bubble sort is a rather futile exercise anyway.