78 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import PySimpleGUI as sg
 | |
| import os
 | |
| 
 | |
| sg.ChangeLookAndFeel('BlueMono')
 | |
| 
 | |
| #get pathname to current file
 | |
| 
 | |
| dirname, filename = os.path.split(os.path.abspath(__file__))
 | |
| pathname = os.path.join(dirname , 'Names.txt')           
 | |
|                          
 | |
| #Get data from file
 | |
| names = [line.strip() for line in open(pathname)]
 | |
| sorted_names = names[:]
 | |
| sorted_names.sort()
 | |
| 
 | |
| tab1_layout =[[sg.Text('Linear Search Demo', font =('Calibri', 14, 'bold'))],
 | |
|         [sg.Listbox(values =[n for n in names], size = (15, 12),font = ('Calibri', 12), background_color ='White',key = '_display1_')],
 | |
|          [sg.Text('_'*15,font = ('Calibri', 12))],
 | |
|          [sg.Text('Enter name to search for:')],
 | |
|          [sg.InputText(size = (18,1), key = '_linear_')],
 | |
|           [sg.ReadButton('Linear Search', size = (15,1))]]
 | |
| 
 | |
| tab2_layout = [[sg.Text('Binary Search Demo', font =('Calibri', 14, 'bold'))],
 | |
|         [sg.Listbox(values =[n for n in sorted_names], size = (15, 12),font = ('Calibri', 12), background_color ='White',key = '_display2_')],
 | |
|          [sg.Text('_'*18,font = ('Calibri', 12))],
 | |
|          [sg.Text('Enter name to search for:')],
 | |
|          [sg.InputText(size = (18,1), key = '_binary_')],
 | |
|           [sg.ReadButton('Binary Search', size = (15,1))]]
 | |
| 
 | |
| layout = [
 | |
|     [sg.TabGroup([[sg.Tab('Linear Search', tab1_layout),sg.Tab('Binary Search', tab2_layout)]])]]
 | |
| 
 | |
| window = sg.Window('Main Window').Layout(layout)
 | |
| 
 | |
| #Linear Search - no need for Ordered list
 | |
| def linear_search():
 | |
|     l = names[:]
 | |
|     found = False
 | |
|     for l in l:
 | |
|         if l == value['_linear_']:             #Check each value
 | |
|             found = True
 | |
|             result = ['Linear search', l + ' found']
 | |
|             window.FindElement('_display1_').Update(result)
 | |
|             break
 | |
|     if not found:
 | |
|         result = [value['_linear_'], 'was not found']
 | |
|         window.FindElement('_display1_').Update(result)
 | |
| 
 | |
| #Binary Search - only works for ordered lists      
 | |
| def binary_search():
 | |
|     l = sorted_names                   
 | |
|     lo = 0
 | |
|     hi = len(l)-1
 | |
|     found = False               
 | |
|     while lo <= hi:
 | |
|         mid = (lo + hi) //2         
 | |
|         if l[mid] == value['_binary_']:    
 | |
|             found = True
 | |
|             result = ['Binary search', l[mid] + ' found.']
 | |
|             window.FindElement('_display2_').Update(result)    
 | |
|             break                   
 | |
|         elif l[mid] < value['_binary_']:
 | |
|             lo = mid + 1            
 | |
|         else:
 | |
|             hi = mid - 1            
 | |
|     if not found:                  
 | |
|         result = [value['_binary_'], 'was not found']
 | |
|         window.FindElement('_display2_').Update(result)
 | |
| 
 | |
| while True:
 | |
|     button, value = window.Read()
 | |
|     if button is not None:
 | |
|         if button == 'Linear Search':
 | |
|             linear_search()
 | |
|         if button == 'Binary Search':
 | |
|             binary_search()
 | |
|     else:
 | |
|         break
 |