项目介绍
一共有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~