Commit 9021711d by BellCodeEditor

save project

parent df69b9ef
'''
用Python实现经典排序算法:
1. 冒泡排序
2. 选择排序
3. 插入排序
4. 希尔排序
5. 归并排序
6. 快速排序
7. 堆排序
8. 计数排序
9. 桶排序
10. 基数排序
'''
def bubble_sort(list):
"""
冒泡排序:
○ 原理:
冒泡排序(Bubble Sort)是一种简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,
如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,
也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换
慢慢“浮”到数列的顶端。
○ 步骤:
冒泡排序算法的运作如下:
1. 比较相邻的元素。如果第一个比第二个大,
就交换他们两个。
2. 对每一对相邻元素作同样的工作,
从开始第一对到结尾的最后一对。
这步做完后,最后的元素会是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,
直到没有任何一对数字需要比较。
:param list: 传入将要排序的数组
:return: 返回冒泡排序完成的数组
"""
length = len(list) # 获取list的长度
# 第一级遍历
for index in range(length):
# 第二级遍历
for j in range(1, length - index):
if list[j - 1] > list[j]:
# 交换两者的数据
list[j - 1], list[j] = list[j], list[j - 1]
print("经过第" + str(index + 1) + "轮,第" + str(j) + "次排序后:" + str(list))
return list
def buuble_soft_upgrade(list):
'''
冒泡排序的升级版:
添加一个标记,
在排序已完成时,停止排序。
:param list: 传入将要排序的数组
:return:返回冒泡排序完成的数组
'''
length = len(list)
for index in range(length):
# 标志位
flag = True
for j in range(1, length - index):
if list[j - 1] > list[j]:
list[j - 1], list[j] = list[j], list[j - 1]
flag = False
print(flag)
print("经过第" + str(j) + "轮排序后:" + str(list) + ",是否继续排序:" + str(flag))
print(flag)
if flag:
print(flag)
# 没有发生交换,直接返回list
return list
return list
def selection_sort(list):
'''
选择排序:
○ 原理:选择排序(Selection sort)
是一种简单直观的排序算法。
它的工作原理大致是将后面最小元素
一个个取出然后按顺序放置。
○ 步骤:
1. 在未排序序列中找到最小(大)元素,
存放到排序序列的起始位置,
2. 再从剩余未排序元素中继续寻找最小(大)元素,
然后放到已排序序列的末尾。
3. 重复第二步,直到所有元素均排序完毕。
:param list: 传入将要排序的数组
:return: 返回选择排序完成的数组
'''
length = len(list) # 获取到数组的长度
for i in range (0, length):
min = i # 标记第一个索引位置为最小的元素
for j in range(i + 1, length): # 从第二个索引位置开始遍历
if list[j] < list[min]: # 如果下一个元素的值小于前一个元素
min = j # 把小的元素往前放昂
list[min], list[i]=list[i], list[min] # 元素置换
print("经过第" + str(i + 1) + "轮循环后:" + str(list))
return list
def insert_sort(list):
"""
插入排序
○ 原理:插入排序(Insertion Sort)是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,
在已排序序列中从后向前扫描,找到相应位置并插入。
○ 步骤:
1. 从第一个元素开始,该元素可以认为已经被排序
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5. 将新元素插入到该位置后
6. 重复步骤2~5
:param list: 传入将要排序的数组
:return:插入排序完成的数组
"""
length = len(list)
for i in range(1, length):
# 后一个元素和前一个元素比较
# 如果比前一个小
if list[i] < list[i - 1]:
# 将这个数取出
temp = list[i]
# 保存下标
index = i
# 从后往前依次比较每个元素
for j in range(i - 1, -1, -1):
# 和比取出元素大的元素交换
if list[j] > temp:
list[j + 1] = list[j]
index = j
else:
break
print(i)
# 插入元素
list[index] = temp
return list
def shell_sort(list):
'''
希尔排序
○ 原理:也称递减增量排序算法,
是插入排序的一种更高效的改进版本。
希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,
即可以达到线性排序的效率
但插入排序一般来说是低效的,
因为插入排序每次只能将数据移动一位。
○ 步骤:
每次以一定步长(就是跳过等距的数)进行排序,
直至步长为1。
:param list: 传入将要排序的数组
:return: 返回经历过希尔排序的数组
'''
length = len(list)
# 初始步长
gap = length // 2
while gap > 0:
for i in range(gap, length):
# 每个步长进行插入排序
temp = list[i]
j = i
# 插入排序
while j >= gap and list[j - gap] > temp:
list[j] = list[j - gap]
j -= gap
list[j] = temp
print("希尔排序过程:" + str(list) + ",本轮排序检查的索引位置是:" + str(i))
# 得到新的步长
gap = gap // 2
return list
def merge_sort(list):
'''
归并排序:
○ 原理:指的是将两个已经排序的序列合并成一个序列的操作。
归并排序算法依赖归并操作。
○ 步骤:假设序列共有n个元素:
1. 将序列每相邻两个数字进行归并操作,形成 {\displaystyle floor(n/2)} floor(n/2)个序列,排序后每个序列包含两个元素
2. 将上述序列再次归并,形成 {\displaystyle floor(n/4)} floor(n/4)个序列,每个序列包含四个元素
3. 重复步骤2,直到所有元素排序完毕
:param list:
:return:
'''
# 认为长度不大于1的数列是有序的
if len(list) <= 1:
return list
# 二分列表
middle = len(list) // 2
left = merge_sort(list[:middle])
right = merge_sort(list[middle:])
# 最后一次合并
return merge(left, right)
# 合并
def merge(left, right):
l, r = 0, 0
result = []
while l < len(left) and r < len(right):
if left[l] <right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
result += left[l:]
result += right[r:]
return result
##############################################
''' 系统自带的排序函数 '''
#list.sort()
# ########## 函数调用 ##########
list = [18, 29, 33, 66, 99, 35, 26, 74, 53]
list2 = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("原数组:" + str(list))
print("经历过冒泡排序后:" + str(bubble_sort(list)))
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("原数组:" + str(list))
print("经历过冒泡排序(优化版)后:" + str(buuble_soft_upgrade(list)))
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("原数组:" + str(list))
print("经历过选择排序后:" + str(selection_sort(list)))
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("原数组:" + str(list))
print("经历过插入排序后:" + str(insert_sort(list)))
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("原数组:" + str(list))
print("经历过希尔排序后:" + str(shell_sort(list)))
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("原数组1:" + str(list))
print("原数组2:" + str(list2))
print("经历过归并排序后:" + str(merge(merge_sort(list),merge_sort(list2))))
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
\ No newline at end of file
import tkinter
root = tkinter.Tk()
root.title("注册")
root.mainloop()
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment