Python으로 정렬 시각화 도구 만들기
구렁이
Python 프로그래밍 언어는 최근 몇 년 동안 컴퓨터 과학 분야에서 주도적인 위치를 차지했고 기계 학습, 데이터 과학, 인공지능, 웹 개발과 소프트웨어 프로그래밍 등 많은 분야에서의 응용은 21세기의 최신 추세이다.PYPL 프로그래밍 언어의 유행 지수에 따르면 다른 프로그래밍 언어에 비해python은 전체 점유율의 31.6%를 차지한다.
따라서 나는 우리가python을 가장 좋은 방식으로python을 배워서 할 수 없는 프로젝트를 구축함으로써 모든 프로그래밍 언어의 기초 중 하나인 정렬을 파악할 수 있다고 생각한다.
본문이 끝날 때, 당신은 다섯 가지 다른 알고리즘을 사용하여 놀라운 정렬 시각화 도구를 구축할 것입니다.
알고리즘
algorithms라는 파일을 만듭니다.여기서, 우리는python으로 모든 정렬 알고리즘을 작성할 것이다.시간 모듈을 가져와 시각화 도구가 사용하는 시간을 알려줍니다. (참고: 표시할 시간은 저희 시스템이 시각화 도구를 렌더링하는 데 사용하는 시간입니다. 정렬 알고리즘과 무관합니다.)
Algorithm이라는 클래스를 만들고 이 코드를 붙여넣습니다.
class Algorithm:
def __init__(self, name):
self.array = random.sample(range(512), 512) # Random array of size 512
self.name = name # Get name of the variable
def update_display(self, swap1=None, swap2=None):
import visualizer
visualizer.update(self, swap1, swap2) # pass the indexes to be swapped into the visualizer
def run(self): # Start the timer and run the algorithm
self.start_time = time.time()
self.algorithm()
time_elapsed = time.time() - self.start_time
return self.array, time_elapsed
우리는 우선 크기가 512인 무작위 그룹을 만듭니다.update_display 방법에서 비주얼라이저에서 update 함수를 호출합니다.우리는 잠시 후py를 작성하여 도형을 처리할 것이다.마지막으로run 방법은 타이머를 시작하고 알고리즘 함수를 호출합니다. 이 함수는 곧 다가올 모든 정렬 알고리즘의 일부입니다.그것은 정렬 후의 그룹과 지나간 시간을 되돌려줍니다.
정렬 선택
class SelectionSort(Algorithm):
def __init__(self):
super().__init__("SelectionSort")
def algorithm(self):
for i in range(len(self.array)):
min_idx = i
for j in range(i+1, len(self.array)):
if self.array[j] < self.array[min_idx]:
min_idx = j
self.array[i], self.array[min_idx] = self.array[min_idx], self.array[i]
self.update_display(self.array[i], self.array[min_idx])
SelectionSort 클래스는 알고리즘 클래스를 계승하고 알고리즘 방법에서 선택 정렬을 실현합니다.그룹이 업데이트될 때마다 업데이트\u 디스플레이 방법을 연속으로 호출하여 그룹의 정렬을 실시간으로 보여 줍니다.마찬가지로 우리도 모든 다른 알고리즘을 똑같이 실현했다.
기포 정렬
class BubbleSort(Algorithm):
def __init__(self):
super().__init__("BubbleSort")
def algorithm(self):
for i in range(len(self.array)):
for j in range(len(self.array)-1-i):
if self.array[j] > self.array[j+1]:
self.array[j], self.array[j+1] = self.array[j+1], self.array[j]
self.update_display(self.array[j], self.array[j+1])
정렬 삽입하기
class InsertionSort(Algorithm):
def __init__(self):
super().__init__("InsertionSort")
def algorithm(self):
for i in range(len(self.array)):
cursor = self.array[i]
idx = i
while idx > 0 and self.array[idx-1] > cursor:
self.array[idx] = self.array[idx-1]
idx -= 1
self.array[idx] = cursor
self.update_display(self.array[idx], self.array[i])
병합 정렬
class MergeSort(Algorithm):
def __init__(self):
super().__init__("MergeSort")
def algorithm(self, array=[]):
if array == []:
array = self.array
if len(array) < 2:
return array
mid = len(array) // 2
left = self.algorithm(array[:mid])
right = self.algorithm(array[mid:])
return self.merge(left, right)
def merge(self, left, right):
result = []
i, j = 0, 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
self.update_display()
result += left[i:]
result += right[j:]
self.array = result
self.update_display()
return result
빠른 정렬
class QuickSort(Algorithm):
def __init__(self):
super().__init__("QuickSort")
def algorithm(self, array=[], start=0, end=0):
if array == []:
array = self.array
end = len(array) - 1
if start < end:
pivot = self.partition(array,start,end)
self.algorithm(array,start,pivot-1)
self.algorithm(array,pivot+1,end)
def partition(self, array, start, end):
x = array[end]
i = start-1
for j in range(start, end+1, 1):
if array[j] <= x:
i += 1
if i < j:
array[i], array[j] = array[j], array[i]
self.update_display(array[i], array[j])
return i
시각화 도구
축하너는 방금 모든 유행하는 정렬 알고리즘을 썼다.마지막 단계는 모든 정렬 알고리즘의 작업 방식을 직관적으로 보여주는 것이다.
이것은 시각화 도구의 코드입니다.py 파일.
import algorithms
import time
import os
import sys
import pygame
# Set the window length and breadth (Make sure that the breadth is equal to size of array. [512])
dimensions = [1024, 512]
# List all the algorithms available in the project in dictionary and call the necessary functions from algorithms.py
algorithms = {"SelectionSort": algorithms.SelectionSort(), "BubbleSort": algorithms.BubbleSort(), "InsertionSort": algorithms.InsertionSort(), "MergeSort": algorithms.MergeSort(), "QuickSort": algorithms.QuickSort()}
# Check list of all the available sorting techniques using 'list'
if len(sys.argv) > 1:
if sys.argv[1] == "list":
for key in algorithms.keys(): print(key, end=" ") # Display the available algorithms
print("")
sys.exit(0)
# Initalise the pygame library
pygame.init()
# Set the dimensions of the window and display it
display = pygame.display.set_mode((dimensions[0], dimensions[1]))
# Fill the window with purple hue
display.fill(pygame.Color("#a48be0"))
def check_events(): # Check if the pygame window was quit
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit();
sys.exit();
def update(algorithm, swap1=None, swap2=None, display=display): # The function responsible for drawing the sorted array on each iteration
display.fill(pygame.Color("#a48be0"))
pygame.display.set_caption("Sorting Visualizer Algorithm: {} Time: {:.3f} Status: Sorting...".format(algorithm.name, time.time() - algorithm.start_time)) # Display on title bar
k = int(dimensions[0]/len(algorithm.array))
for i in range(len(algorithm.array)):
colour = (80, 0, 255)
if swap1 == algorithm.array[i]:
colour = (0,255,0)
elif swap2 == algorithm.array[i]:
colour = (255,0,0)
# The most important step that renders the rectangles to the screen that gets sorted.
# pygame.draw.rect(dsiplay_window, color_of_rectangle, size_of_rectangle)
pygame.draw.rect(display, colour, (i*k,dimensions[1],k,-algorithm.array[i]))
check_events()
pygame.display.update()
def keep_open(algorithm, display, time): # Keep the window open until sort completion
pygame.display.set_caption("Sorting Visualizer Algorithm: {} Time: {:.3f} Status: Done!".format(algorithm.name, time))
while True:
check_events()
pygame.display.update()
def main():
if len(sys.argv) < 2:
print("Please select a sorting algorithm.")
else:
try:
algorithm = algorithms[sys.argv[1]] # Pass the algorithm selected
try:
time_elapsed = algorithm.run()[1]
keep_open(algorithm, display, time_elapsed)
pass
except:
pass
except:
print("Error.")
if __name__ == "__main__":
main()
맞다나는 많은 코드를 소화해야 한다는 것을 알고 있지만, 나는 너에게 이 프로젝트의 실행 단추를 눌렀을 때, 모든 것이 성과가 있을 것이라고 보증한다.동시에, 시각화 도구 코드를 설명해 드리겠습니다.
class Algorithm:
def __init__(self, name):
self.array = random.sample(range(512), 512) # Random array of size 512
self.name = name # Get name of the variable
def update_display(self, swap1=None, swap2=None):
import visualizer
visualizer.update(self, swap1, swap2) # pass the indexes to be swapped into the visualizer
def run(self): # Start the timer and run the algorithm
self.start_time = time.time()
self.algorithm()
time_elapsed = time.time() - self.start_time
return self.array, time_elapsed
class SelectionSort(Algorithm):
def __init__(self):
super().__init__("SelectionSort")
def algorithm(self):
for i in range(len(self.array)):
min_idx = i
for j in range(i+1, len(self.array)):
if self.array[j] < self.array[min_idx]:
min_idx = j
self.array[i], self.array[min_idx] = self.array[min_idx], self.array[i]
self.update_display(self.array[i], self.array[min_idx])
class BubbleSort(Algorithm):
def __init__(self):
super().__init__("BubbleSort")
def algorithm(self):
for i in range(len(self.array)):
for j in range(len(self.array)-1-i):
if self.array[j] > self.array[j+1]:
self.array[j], self.array[j+1] = self.array[j+1], self.array[j]
self.update_display(self.array[j], self.array[j+1])
class InsertionSort(Algorithm):
def __init__(self):
super().__init__("InsertionSort")
def algorithm(self):
for i in range(len(self.array)):
cursor = self.array[i]
idx = i
while idx > 0 and self.array[idx-1] > cursor:
self.array[idx] = self.array[idx-1]
idx -= 1
self.array[idx] = cursor
self.update_display(self.array[idx], self.array[i])
class MergeSort(Algorithm):
def __init__(self):
super().__init__("MergeSort")
def algorithm(self, array=[]):
if array == []:
array = self.array
if len(array) < 2:
return array
mid = len(array) // 2
left = self.algorithm(array[:mid])
right = self.algorithm(array[mid:])
return self.merge(left, right)
def merge(self, left, right):
result = []
i, j = 0, 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
self.update_display()
result += left[i:]
result += right[j:]
self.array = result
self.update_display()
return result
class QuickSort(Algorithm):
def __init__(self):
super().__init__("QuickSort")
def algorithm(self, array=[], start=0, end=0):
if array == []:
array = self.array
end = len(array) - 1
if start < end:
pivot = self.partition(array,start,end)
self.algorithm(array,start,pivot-1)
self.algorithm(array,pivot+1,end)
def partition(self, array, start, end):
x = array[end]
i = start-1
for j in range(start, end+1, 1):
if array[j] <= x:
i += 1
if i < j:
array[i], array[j] = array[j], array[i]
self.update_display(array[i], array[j])
return i
축하너는 방금 모든 유행하는 정렬 알고리즘을 썼다.마지막 단계는 모든 정렬 알고리즘의 작업 방식을 직관적으로 보여주는 것이다.
이것은 시각화 도구의 코드입니다.py 파일.
import algorithms
import time
import os
import sys
import pygame
# Set the window length and breadth (Make sure that the breadth is equal to size of array. [512])
dimensions = [1024, 512]
# List all the algorithms available in the project in dictionary and call the necessary functions from algorithms.py
algorithms = {"SelectionSort": algorithms.SelectionSort(), "BubbleSort": algorithms.BubbleSort(), "InsertionSort": algorithms.InsertionSort(), "MergeSort": algorithms.MergeSort(), "QuickSort": algorithms.QuickSort()}
# Check list of all the available sorting techniques using 'list'
if len(sys.argv) > 1:
if sys.argv[1] == "list":
for key in algorithms.keys(): print(key, end=" ") # Display the available algorithms
print("")
sys.exit(0)
# Initalise the pygame library
pygame.init()
# Set the dimensions of the window and display it
display = pygame.display.set_mode((dimensions[0], dimensions[1]))
# Fill the window with purple hue
display.fill(pygame.Color("#a48be0"))
def check_events(): # Check if the pygame window was quit
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit();
sys.exit();
def update(algorithm, swap1=None, swap2=None, display=display): # The function responsible for drawing the sorted array on each iteration
display.fill(pygame.Color("#a48be0"))
pygame.display.set_caption("Sorting Visualizer Algorithm: {} Time: {:.3f} Status: Sorting...".format(algorithm.name, time.time() - algorithm.start_time)) # Display on title bar
k = int(dimensions[0]/len(algorithm.array))
for i in range(len(algorithm.array)):
colour = (80, 0, 255)
if swap1 == algorithm.array[i]:
colour = (0,255,0)
elif swap2 == algorithm.array[i]:
colour = (255,0,0)
# The most important step that renders the rectangles to the screen that gets sorted.
# pygame.draw.rect(dsiplay_window, color_of_rectangle, size_of_rectangle)
pygame.draw.rect(display, colour, (i*k,dimensions[1],k,-algorithm.array[i]))
check_events()
pygame.display.update()
def keep_open(algorithm, display, time): # Keep the window open until sort completion
pygame.display.set_caption("Sorting Visualizer Algorithm: {} Time: {:.3f} Status: Done!".format(algorithm.name, time))
while True:
check_events()
pygame.display.update()
def main():
if len(sys.argv) < 2:
print("Please select a sorting algorithm.")
else:
try:
algorithm = algorithms[sys.argv[1]] # Pass the algorithm selected
try:
time_elapsed = algorithm.run()[1]
keep_open(algorithm, display, time_elapsed)
pass
except:
pass
except:
print("Error.")
if __name__ == "__main__":
main()
맞다나는 많은 코드를 소화해야 한다는 것을 알고 있지만, 나는 너에게 이 프로젝트의 실행 단추를 눌렀을 때, 모든 것이 성과가 있을 것이라고 보증한다.동시에, 시각화 도구 코드를 설명해 드리겠습니다.pip install pygame
을 통해pygame을 설치합니다.결과
결국 우리의 프로젝트를 실행할 때가 되었다.프로젝트 디렉터리에서 터미널을 열고 실행python visualizer.py list
하여 사용 가능한 모든 알고리즘의 목록을 가져옵니다.
그리고 실행python visualizer.py <sorting-algorithm>
그 중에서 정렬 알고리즘은 목록에 언급된 알고리즘 중의 하나이다.
예:python visualizer.py SelectionSort
나는 네가 이 프로젝트를 좋아하길 바라며, 동시에python 정렬 알고리즘을 배웠다.만약 어떤 의문이 있으면 언제든지 저에게 연락 주세요.이 코드는 myGitHub에서 제공합니다.
정말 감사합니다.
Reference
이 문제에 관하여(Python으로 정렬 시각화 도구 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/kgprajwal/build-a-sorting-visualizer-in-python-2oej
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Python으로 정렬 시각화 도구 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kgprajwal/build-a-sorting-visualizer-in-python-2oej텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)