Python으로 정렬 시각화 도구 만들기

38101 단어 pythonbeginners

구렁이


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()
    
    
    맞다나는 많은 코드를 소화해야 한다는 것을 알고 있지만, 나는 너에게 이 프로젝트의 실행 단추를 눌렀을 때, 모든 것이 성과가 있을 것이라고 보증한다.동시에, 시각화 도구 코드를 설명해 드리겠습니다.
  • 우선, 알고리즘을 작성한python 파일을 가져옵니다.그리고python에서 pygame 모듈을 가져와 프로젝트에서 도형을 사용합니다.
  • 이외에 터미널에서 실행pip install pygame을 통해pygame을 설치합니다.
  • 차원수 그룹에 창 크기를 설정하고 두 번째 파라미터 512를 보존하십시오. 이것은 우리가 사용하는 무작위 샘플 수이기 때문입니다.
  • 다음 몇 줄 명령은 사용자에게 사용 가능한 알고리즘의 목록을 표시하고 알고리즘을 선택하고 코드를 실행할 때 입력하라고 알려 줍니다.
  • 그리고pygame 모듈을 초기화하여 창의 크기를 설정하고 색으로 디스플레이를 채웁니다.
  • check_events 기능은 창이 닫힐 때 프로그램을 종료하는 데 사용됩니다.
  • 그러면 전체 프로그램 업데이트 방법 중 가장 중요한 기능이 있다.이 방법은 매번 교체된 후에 수조와 수중의 두 개의 교환 변수, swap1과 swap2 변수를 수신한다.이 변수들은 서로 다른 색을 분배했다.
  • 그리고 우리는pygame를 사용합니다.그리다함수의 역할은 이 그룹 요소를 창에 렌더링하고 업데이트하는 것입니다.
  • keep_open 함수는 pygame 창이 실행되고 창이 종료되지 않았을 때 열려 있도록 합니다.
  • 마지막으로 주 함수는 사용자가 선택한 알고리즘을 입력으로 하고 특정 알고리즘과 타이머를 호출한다.
  • 결과


    결국 우리의 프로젝트를 실행할 때가 되었다.프로젝트 디렉터리에서 터미널을 열고 실행python visualizer.py list하여 사용 가능한 모든 알고리즘의 목록을 가져옵니다.

    그리고 실행python visualizer.py <sorting-algorithm>그 중에서 정렬 알고리즘은 목록에 언급된 알고리즘 중의 하나이다.
    예:python visualizer.py SelectionSort


    나는 네가 이 프로젝트를 좋아하길 바라며, 동시에python 정렬 알고리즘을 배웠다.만약 어떤 의문이 있으면 언제든지 저에게 연락 주세요.이 코드는 myGitHub에서 제공합니다.

    정말 감사합니다.

    좋은 웹페이지 즐겨찾기