[Tutor] bubble sort function

Steven D'Aprano steve at pearwood.info
Sun Nov 16 05:50:33 CET 2014


On Sat, Nov 15, 2014 at 04:46:26PM +0000, Spyros Charonis wrote:
> Dear group,
> 
> 
> I'm having a bit of trouble with understanding why my bubble sort
> implementation doesn't work. I've got the following function to perform a
> bubble sort operation on a list of numbers:

It doesn't work because it is completely wrong. Sorry to be harsh, but 
sometimes it is easier to throw broken code away and start again than it 
is to try to diagnose the problems with it.

Let's start with the unoptimized version of bubblesort given by 
Wikipedia:

https://en.wikipedia.org/wiki/Bubble_sort#Implementation

procedure bubbleSort( A : list of sortable items )
   n = length(A)
   repeat 
     swapped = false
     for i = 1 to n-1 inclusive do
       /* if this pair is out of order */
       if A[i-1] > A[i] then
         /* swap them and remember something changed */
         swap( A[i-1], A[i] )
         swapped = true
       end if
     end for
   until not swapped
end procedure


Let's translate that to Python:

def bubbleSort(alist):
    n = len(alist)
    swapped = True
    while swapped:
        swapped = False
        for i in range (1, n-1):
            # if this pair is out of order
            if alist[i-1] > alist[i]:
                # swap them and remember something changed
                alist[i-1], alist[i] = alist[i], alist[i-1]
                swapped = True


Let's add something to print the partially sorted list each time we go 
through the loop:


def bubbleSort(alist):
    print("Unsorted: %r" % alist)
    n = len(alist)
    swapped = True
    count = swaps = 0
    while swapped:
        count += 1
        swapped = False
        for i in range (1, n):
            # if this pair is out of order
            if alist[i-1] > alist[i]:
                # swap them and remember something changed
                swaps += 1
                alist[i-1], alist[i] = alist[i], alist[i-1]
                swapped = True
        print("Iteration %d, %d swaps; list: %r" % (count, swaps, alist))



And now let's try it:

py> mylist = [2, 4, 6, 8, 1, 3, 5, 7, 9, 0]
py> bubbleSort(mylist)
Unsorted: [2, 4, 6, 8, 1, 3, 5, 7, 9, 0]
Iteration 1, 5 swaps; list: [2, 4, 6, 1, 3, 5, 7, 8, 0, 9]
Iteration 2, 9 swaps; list: [2, 4, 1, 3, 5, 6, 7, 0, 8, 9]
Iteration 3, 12 swaps; list: [2, 1, 3, 4, 5, 6, 0, 7, 8, 9]
Iteration 4, 14 swaps; list: [1, 2, 3, 4, 5, 0, 6, 7, 8, 9]
Iteration 5, 15 swaps; list: [1, 2, 3, 4, 0, 5, 6, 7, 8, 9]
Iteration 6, 16 swaps; list: [1, 2, 3, 0, 4, 5, 6, 7, 8, 9]
Iteration 7, 17 swaps; list: [1, 2, 0, 3, 4, 5, 6, 7, 8, 9]
Iteration 8, 18 swaps; list: [1, 0, 2, 3, 4, 5, 6, 7, 8, 9]
Iteration 9, 19 swaps; list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Iteration 10, 19 swaps; list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]



Now you can inspect the working code and compare it to the non-working 
code below and see what is different:


> def bubble_sort_ascending(unsorted):
>       """ Sorts a list of numbers into ascending order """
>        iterations = 0
>         size = len(unsorted) - int(1)
>        for i in range(0, size):
>             unsorted[i] = float(unsorted[i])
>             while unsorted[i] > unsorted[i+1]:
>                   # Use a tuple assignment in order to swap the value of
> two variables
>                   unsorted[i], unsorted[i+1] = unsorted[i+1], unsorted[i]
>                   iterations += 1
>                   sorted_vec = unsorted[:] # copy unsorted which is now
> sorted
>                   print "\nIterations completed: %s\n" %(iterations)
>        return sorted_vec



-- 
Steven


More information about the Tutor mailing list