六大排序算法及部分动画演示(Python)

import matplotlib.pyplot as plt
import numpy as np
from IPython.display import display, clear_output
from palettable.colorbrewer.qualitative import *  # 调色板

在这里插入图片描述

冒泡排序

def bubble_sort(arr):
    list_len = len(arr)
    try:
        arr = arr.tolist()
    except:
        pass
    x_ticks = list(range(list_len))
    
    '''图'''
    fig, ax = plt.subplots()
    ax.bar(x_ticks, height=arr, color=Set2_8.hex_colors)
    plt.pause(0.5)

    for i in range(list_len-1):
        flag = False
        for j in range(list_len - i - 1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                flag = True
            
            """图"""
            ax.cla()
            ax.bar(x_ticks, height=arr, color=Set2_8.hex_colors)
            clear_output(wait = True)
            display(fig)
            clear_output(wait = True)
            plt.pause(0.01)
            
        if flag == False:
            break
            
    display(fig)
    
    return arr

选择排序

def select_sort(arr):
    list_len = len(arr)
    try:
        arr = arr.tolist()
    except:
        pass
    x_ticks = list(range(list_len))
    
    '''图'''
    fig, ax = plt.subplots()
    ax.bar(x_ticks, height=arr, color=Set2_8.hex_colors)
    plt.pause(0.5)
    
    for i in range(list_len):
        
        min_index = i
        for j in range(i+1, list_len):
            if arr[j] < arr[min_index]:
                min_index = j
        
        if min_index != i:
            arr[i], arr[min_index] = arr[min_index], arr[i]

        """图"""
        ax.cla()
        ax.bar(x_ticks, height=arr, color=Set2_8.hex_colors)
        clear_output(wait = True)
        display(fig)
        clear_output(wait = True)
        plt.pause(0.01)

    display(fig)

    return arr

插入排序

def insert_sort(arr):
    list_len = len(arr)
    try:
        arr = arr.tolist()
    except:
        pass
    x_ticks = list(range(list_len))
    
    '''图'''
    fig, ax = plt.subplots()
    ax.bar(x_ticks, height=arr, color=Set2_8.hex_colors)
    plt.pause(0.5)
    
    for i in range(list_len-1):
        for j in range(i+1,0,-1):
            if arr[j] < arr[j-1]:
                arr[j], arr[j-1] = arr[j-1], arr[j]
                
                """图"""
                ax.cla()
                ax.bar(x_ticks, height=arr, color=Set2_8.hex_colors)
                clear_output(wait = True)
                display(fig)
                clear_output(wait = True)
                plt.pause(0.01)
            else:
                break
                
    return arr

希尔排序

def shell_sort(arr):
    list_len = len(arr)
    try:
        arr = arr.tolist()
    except:
        pass
    x_ticks = list(range(list_len))
    
    '''图'''
    fig, ax = plt.subplots()
    ax.bar(x_ticks, height=arr, color=Set2_8.hex_colors)
    plt.pause(0.5)
    
    temp = list_len // 2
    while temp > 0:
        for k in range(temp):        
            for i in range(k+temp,list_len,temp):
                for j in range(i,k,-temp):
                    if arr[j] < arr[j-temp]:
                        arr[j], arr[j-temp] = arr[j-temp], arr[j]
                        
                        """图"""
                        ax.cla()
                        ax.bar(x_ticks, height=arr, color=Set2_8.hex_colors)
                        clear_output(wait = True)
                        display(fig)
                        clear_output(wait = True)
                        plt.pause(0.01)
                    else:
                        break
                        
                    
        temp //= 2

快速排序

def swap(lst,i,j):
    lst[i], lst[j] = lst[j], lst[i]
    
def median3(lst,left,right):
    mid = (left + right) // 2
    if lst[left] > lst[mid]:
        swap(lst, left, mid)
    if lst[left] > lst[right]:
        swap(lst, left, right)
    if lst[mid] > lst[right]:
        swap(lst, mid, right)
    swap(lst, mid, right-1)
    
    return lst[right-1]

def quicksort(arr, left, right):
    list_len = right - left + 1
    if list_len < 2:
        return
    
    pivot = median3(arr, left, right)
    i = left
    j = right - 2
    while True:
        while arr[i] < pivot:
            i+=1
        while arr[j] > pivot:
            j-=1
        if i < j:
            swap(arr, i, j)
        else:
            swap(arr, i, right-1)
            break
            
    quicksort(arr, left, i-1)
    quicksort(arr, i+1, right)
    
    return arr

def quick_sort(arr):
    try:
        arr = arr.tolist()
    except:
        pass
    left = 0
    right = len(arr) - 1
    quicksort(arr, left, right)
    
    return arr

归并排序

def merge(l_lst, r_lst):
    temp = []
    while l_lst and r_lst:
        if l_lst[0] <= r_lst[0]:
            temp.append(l_lst.pop(0))
        else:
            temp.append(r_lst.pop(0))
    while l_lst:
        temp.append(l_lst.pop(0))
    while r_lst:
        temp.append(r_lst.pop(0))
        
    return temp

def merge_sort(arr):
    try:
        arr = arr.tolist()
    except:
        pass
    list_len = len(arr)
    if list_len < 2:
        return arr
    mid = list_len // 2
    left = merge_sort(arr[0:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值