An algorithm like Insertion Sort can be understood easily by visualizing. In this article, a program that visualizes the Insertion Sort Algorithm has been implemented.
The Graphical User Interface(GUI) is implemented in python using pygame library.
Approach:
- Generate random array and fill the pygame window with bars. Bars are straight vertical lines, which represents array elements.
- Set all bars to green color (unsorted).
- Use pygame.time.delay() to slow down the algorithm, so that we can see the sorting process.
- Implement a timer to see how the algorithm performs.
- The actions are performed using ‘pygame.event.get()’ method, which stores all the events which user performs, such as start, reset.
- Blue color is used to highlight bars that are involved in sorting at a particular time.
- Orange color highlights the bars sorted.
Observations:
We can clearly see from the Insertion Sort visualization, that insertion Sort is very slow compared to other sorting algorithms like Mergesort or Quicksort.
Examples:
Input:
Press “Enter” key to Perform Visualization.
Press “R” key to generate new array.
Output:
Initial:
Sorting:
Final:
Please make sure to install the pygame library before running the below program.
Below is the implementation of the above visualizer:
Python3
# Python implementation of the # Sorting visualiser: Insertion Sort # Imports import pygame import random import time pygame.font.init() startTime = time.time() # Total window screen = pygame.display.set_mode( ( 900 , 650 ) ) # Title and Icon pygame.display.set_caption( "SORTING VISUALISER" ) # Uncomment below lines for setting # up the icon for the visuliser # img = pygame.image.load('sorticon.png') # pygame.display.set_icon(img) # Boolean variable to run # the program in while loop run = True # Window size and some initials width = 900 length = 600 array = [ 0 ] * 151 arr_clr = [( 0 , 204 , 102 )] * 151 clr_ind = 0 clr = [( 0 , 204 , 102 ), ( 255 , 0 , 0 ), \ ( 0 , 0 , 153 ), ( 255 , 102 , 0 )] fnt = pygame.font.SysFont( "comicsans" , 30 ) fnt1 = pygame.font.SysFont( "comicsans" , 20 ) # Function to generate new Array def generate_arr(): for i in range ( 1 , 151 ): arr_clr[i] = clr[ 0 ] array[i] = random.randrange( 1 , 100 ) # Initially generate a array generate_arr() # Function to refill the # updates on the window def refill(): screen.fill(( 255 , 255 , 255 )) draw() pygame.display.update() pygame.time.delay( 10 ) # Sorting Algorithm: Insertion sort def insertionSort(array): for i in range ( 1 , len (array)): pygame.event.pump() refill() key = array[i] arr_clr[i] = clr[ 2 ] j = i - 1 while j> = 0 and key<array[j]: arr_clr[j] = clr[ 2 ] array[j + 1 ] = array[j] refill() arr_clr[j] = clr[ 3 ] j = j - 1 array[j + 1 ] = key refill() arr_clr[i] = clr[ 0 ] # Function to Draw the array values def draw(): # Text should be rendered txt = fnt.render( "SORT: PRESS 'ENTER'" , \ 1 , ( 0 , 0 , 0 )) # Position where text is placed screen.blit(txt, ( 20 , 20 )) txt1 = fnt.render( "NEW ARRAY: PRESS 'R'" , \ 1 , ( 0 , 0 , 0 )) screen.blit(txt1, ( 20 , 40 )) txt2 = fnt1.render( "ALGORITHM USED:" \ "INSERTION SORT" , 1 , ( 0 , 0 , 0 )) screen.blit(txt2, ( 600 , 60 )) text3 = fnt1.render( "Running Time(sec): " + \ str ( int (time.time() - startTime)), \ 1 , ( 0 , 0 , 0 )) screen.blit(text3, ( 600 , 20 )) element_width = (width - 150 ) / / 150 boundry_arr = 900 / 150 boundry_grp = 550 / 100 pygame.draw.line(screen, ( 0 , 0 , 0 ), ( 0 , 95 ), \ ( 900 , 95 ), 6 ) # Drawing the array values as lines for i in range ( 1 , 151 ): pygame.draw.line(screen, arr_clr[i], \ (boundry_arr * i - 3 , 100 ), \ (boundry_arr * i - 3 , \ array[i] * boundry_grp + 100 ), element_width) # Program should be run # continuously to keep the window open while run: # background screen.fill(( 255 , 255 , 255 )) # Event handler stores all event for event in pygame.event.get(): # If we click Close button in window if event. type = = pygame.QUIT: run = False if event. type = = pygame.KEYDOWN: if event.key = = pygame.K_r: generate_arr() if event.key = = pygame.K_RETURN: insertionSort(array) draw() pygame.display.update() pygame.quit() |
Output: