2
\$\begingroup\$

I have written the below bubble sort code in Python.

def bubble_sort():
    num_list=[]
    list_cnt=input("How many numbers you would like to sort:")
    for i in range(int(list_cnt)): ### need to convert the value returned by input()
        num_list.append(input("Enter " +str(i)+" number:")) ##here we are using append method of list

    print("The values input are as follows:")
    print(num_list)

    print(len(num_list))
    ### Below new line of code added to convert list to integer###
    num_list=list(map(int,num_list))
    ## with the above line the code is now working as expected##
    max_index=len(num_list)-1 ## because list begins with 0
    print("max_index is:",max_index)
    for i in range(len(num_list)-1):
        j=0
        swapped=False
        for j in range(len(num_list)-1):
            if num_list[j] > num_list[j+1]:
                num_list[j],num_list[j+1]=num_list[j+1],num_list[j]
                print("Sorted when j=" +str(j)+ " and i=" + str(i)+ " is:\n ")
                print(num_list)
                swapped=True
        if not swapped:
            break

    print("The sorted list is :")
    print(num_list)    

bubble_sort()
\$\endgroup\$
3
\$\begingroup\$

Your code's quite good. I'd however change it in the following ways:

  1. Move the creation of the lits out of the buble_sort.
  2. Remove the prints from buble_sort.
  3. Follow PEP8.
  4. Change for i in range(...) to while True:.
  5. Use better variables. num_list to array could do.
  6. Use str.format, rather than string addition.
  7. Change the creation of num_list to use a list comprehension.
def bubble_sort(array):
    while True:
        swapped = False
        for j in range(len(array)-1):
            if array[j] > array[j+1]:
                array[j], array[j+1] = array[j+1], array[j]
                swapped = True
        if not swapped:
            break


if __name__ == '__main__':
    amount = input("How many numbers you would like to sort:")
    array = [
        int(input("Enter {} number:".format(i)))
        for i in range(int(amount))
    ]

    print("The values input are as follows: {}".format(array))
    bubble_sort(array)
    print("The sorted list is: {}".format(array))
\$\endgroup\$
  • 3
    \$\begingroup\$ I agree with everything except renaming num_list to array, since it is a list, not an array. numbers would probably be better, since it explains what it contains, and implies that it is a sequence without stating a concrete type. \$\endgroup\$ – Raimund Krämer Apr 25 '18 at 13:43
  • \$\begingroup\$ @RaimundKrämer You could use list however that shadows list. They're also IIRC arrays with list interfaces, so it's simpler to call it a list. Also we're only using it for it's array interface. But yeah numbers could work. \$\endgroup\$ – Peilonrayz Apr 25 '18 at 13:45
1
\$\begingroup\$

The IO code is mixed with the logic code. I separated them. Also, I made a few other changes including removing useless comments (the code should speak for itself, your comments don't add much; if you need comments, that probably means you should simplify your code). I also converted the numbers as soon as they are input.

def bubble_sort(num_list):
    for i in range(len(num_list)-1):
        j = 0
        swapped = False

        for j in range(len(num_list) - 1):
            if num_list[j] > num_list[j+1]:
                num_list[j], num_list[j+1] = num_list[j+1], num_list[j]
                swapped = True

        if not swapped:
            return


def main():
    num_list = []
    num_items = int(input("How many numbers you would like to sort:"))

    for i in range(num_items):
        num_list.append(int(input("Enter " + str(i + 1) + "st number:")))

    bubble_sort(num_list)
    print("The sorted list is:")
    print(num_list)

if __name__ == '__main__':
    main()
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.