python可视化排序算法(完结)& 6种排序算法讲解!

项目介绍

一共有6种排序算法

冒泡排序、快速排序、归并排序、插入排序、选择排序、和计数排序(最快!)

使用的时候把函数注释去掉使用

有红线标识

速度在函数内sleep函数内调节

非常实用!

代码

import pygame
import sys
from pygame.locals import *
from random import shuffle
from time import sleep
sys.setrecursionlimit(1000000000)
pygame.init()
screen = pygame.display.set_mode((1200,600))
def showList(myList,redList = []):
    screen.fill(Color(0,0,0))
    for i in range(200):
        k = 1200 / 201 * (i + 1)
        screen.fill(Color(255,255,255),Rect(k + 0.5,600 - myList[i] * 2,1200 / 201 - 1,myList[i] * 2))
    if redList != []:
        for i in redList:
            k = 1200 / 201 * (i + 1)
            screen.fill(Color(255,0,0),Rect(k + 0.5,600 - myList[i] * 2,1200 / 201 - 1,myList[i] * 2))
    pygame.display.update()
x = list(range(1,201))
x = x[::-1]
shuffle(x)
def mao_pao(num_list):
    num_len = len(num_list)
    for j in range(num_len):
        #sign = False
        for i in range(num_len - 1 - j):
            if x[i] > x[i+1]:
                x[i],x[i + 1] = x[i + 1],x[i]
                showList(x,[i,i + 1])  
            else:
                showList(x,[i,i + 1])
                #sign = True
            #if not sign:
                #break
    showList(x)
def quicksort(l,r):
    m = x[(l + r) // 2]
    i = l
    j = r
    while (i <= j):
        while (x[i] < m):
            i += 1
        while (x[j] > m):
            j -= 1
        if (i <= j):
            x[i],x[j] = x[j],x[i]
            sleep(0.01)
            showList(x,[i,j])
            i += 1
            j -= 1
    if (l < j):
        quicksort(l,j)
    if (i < r):
        quicksort(i,r)
    showList(x)
def merge(a,b):
    pl = 0
    pr = 0
    len_a = len(a)
    len_b = len(b)
    t = []
    while pl < len_a and pr < len_b:
        if a[pl] <= b[pr]:
            t += [a[pl]]
            pl += 1
        else:
            t += [b[pr]]
            pr += 1
        showList(x,[x.index(a[pl - 1]),x.index(b[pr - 1])])
        sleep(0.002)
    if pl < len_a:
        t += a[pl:]
        showList(x,[x.index(a[pl - 1])])
        sleep(0.002)
    if pr < len_b:
        t += b[pr:]
        showList(x,[x.index(b[pr - 1])])
        sleep(0.002)
    return t
def mergeSort(l,r):
    if l == r:
        return
    mid = (l + r) // 2
    mergeSort(l,mid)
    mergeSort(mid + 1,r)
    t = merge(x[l:mid + 1],x[mid + 1:r + 1])
    n = l
    for i in t:
        x[n] = i
        showList(x,[n])
        n += 1
        sleep(0.002)
def selectSort():
    length = len(x)
    if length <= 1:
        return x
    for j in range(length):
        min_num_index = j
        for i in range(j+1, length):
            if x[i] < x[min_num_index]:
                min_num_index = i
                showList(x,[min_num_index,j,i])
        x[min_num_index], x[j] = x[j], x[min_num_index]
        showList(x,[min_num_index,j,i])
        sleep(0.02)
def insertionSort():
    for i in range(200):
        cur_index = i
        while x[cur_index - 1] > x[cur_index] and cur_index - 1 >= 0:
            x[cur_index],x[cur_index - 1] = x[cur_index - 1],x[cur_index]
            showList(x,[cur_index,cur_index - 1,i])
            cur_index -= 1
            sleep(0.002)
def countingSort():
    t = [0] * 200
    for i in x:
        t[i - 1] += 1
        showList(x,[i - 1])
        sleep(0.002)
    num = 0
    for i in range(200):
        while t[i] > 0:
            x[num] = i
            showList(x,[num,i])
            num += 1
            t[i] -= 1
#mao_pao(x)
#quicksort(0,199)
#mergeSort(0,199)
#selectSort()
#insertionSort()
#countingSort()
while True:
    showList(x)
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()

排序算法讲解

冒泡排序

每次比较相邻元素,如果满足条件,就交换元素。

这样,大的元素就会慢慢浮上来,所以叫做冒泡排序

例子:

3 2 7 4 6

2 3 7 4 6

2 3 7 4 6

2 3 4 7 6

2 3 4 6 7

如果列表复杂,可能就要排序很多遍,而不是现在的一边过

已最差的时间复杂度来说,要执行n次检查,每次检查需要n的次数

所以,冒泡排序的时间复杂度为O(n^2)!

快速排序

每次选择一个数,做为划分点。

把比划分点小的放左边,把比划分点大的放右边。

一次划分结束!

然后对划分点左边和右边进行快速排序,一次一次迭代,是快速排序的核心。

如果只剩一个元素了,那自然有序,就直接返回。

例子:

2 3 7 6 1

2 3 6 1 7

2 3 6 1 7

2 1 3 6 7

1 2 3 6 7

每次划分要执行n的次数

执行了logn ~ n次划分

时间复杂度O(nlogn)O(n^2)!

归并排序

把列表分成两部分,分别进行归并排序,然后合起来,就可以了。

(实在没什么好讲的……)

严格执行了logn次划分

划分的时间复杂度为n

时间复杂度O(nlogn)

注意:归并排序在归并的时候要用额外数组,所以一般来说快速排序更快!

插入和选择排序

插入排序,每次把数组中的无序部分第一个元素插入到有序部分里,最后完成排序。

选择排序,每次把数组中的无序部分条最小值添加到有序部分里,最后完成排序。

时间复杂度都是O(n^2)

计数排序

用额外数组完成排序,号称代码最少,速度最快称号,时间复杂度为O(n),比快速排序快6倍!

个人感觉像超级归并(不过是整体归并)

简单粗暴!

小结

下次我还会做一个项目,计算项目用c++,动画项目用python

我会在评论区里挑一个项目做!

byebye~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值