3
\$\begingroup\$

How to improve this code? In C++ we use templates to write function for all data types. How to write such code in python?

def get_input(): #to get input from user
 input_str = input("Enter elements to be sorted: ")
 try:
 lst = list(map(int, input_str.split())) #make a list of integers from input string
 except:
 raise TypeError("Please enter a list of integers only, seperated by a space!!")
 return lst
def partition(thelist, start_idx, end_idx): #partition list according to pivot and return index of pivot
 pivot = thelist[end_idx] #select last element as the pivot
 idx = start_idx - 1
 for curr_idx in range(start_idx, end_idx):
 if thelist[curr_idx] <= pivot:
 idx += 1
 thelist[idx], thelist[curr_idx] = thelist[curr_idx], thelist[idx] #swapping
 thelist[idx+1], thelist[end_idx] = thelist[end_idx], thelist[idx+1] #swapping
 return idx+1 #returning pivot index
def quick_sort(thelist, start_idx, end_idx):
 if len(thelist) == 0:
 print("Empty list!!")
 elif len(thelist) == 1:
 print("Only one element!!")
 elif start_idx < end_idx:
 pivot_idx = partition(thelist, start_idx, end_idx) #get pivot index
 quick_sort(thelist, start_idx, pivot_idx - 1) #apply algorithm for smaller list
 quick_sort(thelist, pivot_idx + 1, end_idx) #apply algorithm for smaller list
if __name__ == '__main__':
 input_list = get_input()
 quick_sort(input_list, 0, len(input_list) - 1)
 print(*input_list, sep = ", ")
asked Jul 2, 2019 at 6:30
\$\endgroup\$
6
  • 1
    \$\begingroup\$ Why would you want to have typed versions of your sorting algorithm in the first place? \$\endgroup\$ Commented Jul 2, 2019 at 7:36
  • \$\begingroup\$ I am learning python and I think this is best to practice algorithms and to learn new language. \$\endgroup\$ Commented Jul 2, 2019 at 8:38
  • \$\begingroup\$ I don't know that much, I thought writing such programs will help me to learn python syntax and other functions available in Python. Should I not learn by writing such(Algorithms and Data Structures) programs? \$\endgroup\$ Commented Jul 2, 2019 at 9:39
  • \$\begingroup\$ @coder you can try PE or CodeAbbey or other sites to improve your skills. But it seems you are already good at it \$\endgroup\$ Commented Jul 3, 2019 at 23:47
  • \$\begingroup\$ What @Linny said. Also, I know it's a technicality, but a list with one or no elements is still technically sorted. \$\endgroup\$ Commented Sep 4, 2019 at 4:41

1 Answer 1

2
\$\begingroup\$

Docstrings

You should include a docstring at the beginning of every function, class, and module you write. This will allow documentation to determine what your code is supposed to do.7

Variable Naming

Here is a list of variables/parameters that I would change. This increases readability, and makes the variables easier to understand.

input_str -> elements
thelist -> the_list
start_idx -> start_index
end_idx -> end_index
idx -> index
curr_idx -> current_index

A quick sentence about thelist. You have been pretty consistent throughout your program, but remember all variables and parameter names are snake_case.

Constants Naming

All constants in your program should be UPPER_CASE.

Operator Spacing

In python, and many other languages, we like to have our operators spaced out cleanly. They make the code easier to read and easier to comprehend. So when I see something like 1+1, that's an instance red flag. You should separate this by having a space on either side of the operator, like 1 + 1.

len(...) == 0 vs not ...

For sequences, (strings, lists, tuples), use the fact that empty sequences are false.

Yes: if not seq:
 if seq:
No: if len(seq):
 if not len(seq):

print() vs quit()

You have a structure like so:

if len(thelist) == 0:
 print("Empty list!!")
elif len(thelist) == 1:
 print("Only one element!!")
elif start_idx < end_idx:
 ... run quick sort program ...

Instead of restricting running the quick sort program to an elif, the first two checks should be separate ifs. Then, instead of using print(), use quit(). This will allow you to safely stop a program with a provided error message. Now, you can have the quick sort code run if the first two checks are false, like so:

if not the_list:
 quit("Empty List!")
if len(the_list) == 1:
 quit("Only one element!")
if start_idx < end_idx:
 ... run quick sort program ...

Parameter spacing

There should not be spaces separating an operator and a parameter name / value. Change this:

print(*input_list, sep = ", ")

to this:

print(*input_list, sep=", ")
answered Sep 4, 2019 at 4:10
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.