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
3 years ago
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
This diff is collapsed.
Click to expand it.
jjjjjjjjjjjjjjjjjjjjjjjdsfjiwefwaqgijorga0wigfrgh0ewrt80wsghi.py
0 → 100644
View file @
9021711d
import
tkinter
root
=
tkinter
.
Tk
()
root
.
title
(
"注册"
)
root
.
mainloop
()
\ No newline at end of file
This diff is collapsed.
Click to expand it.
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