Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Administrator
/
level3-lesson16-diy2
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
9021711d
authored
Aug 09, 2021
by
BellCodeEditor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
save project
parent
df69b9ef
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
262 additions
and
0 deletions
Sort_demo.py
jjjjjjjjjjjjjjjjjjjjjjjdsfjiwefwaqgijorga0wigfrgh0ewrt80wsghi.py
Sort_demo.py
0 → 100644
View file @
9021711d
'''
用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
jjjjjjjjjjjjjjjjjjjjjjjdsfjiwefwaqgijorga0wigfrgh0ewrt80wsghi.py
0 → 100644
View file @
9021711d
import
tkinter
root
=
tkinter
.
Tk
()
root
.
title
(
"注册"
)
root
.
mainloop
()
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment