Skip to content

Commit 328637c

Browse files
authored
Add files via upload
1 parent d8ea101 commit 328637c

File tree

2 files changed

+178
-0
lines changed

2 files changed

+178
-0
lines changed

sort.png

22.3 KB
Loading

sort_compare.py

+178
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
# # -*- coding:utf-8 -*-
2+
# &Author AnFany
3+
4+
5+
6+
# 本文提供8种排序算法
7+
import numpy as np
8+
from prettytable import PrettyTable # 用表格输出时间对比
9+
import time
10+
11+
12+
paidict = {'Bubble': ['冒泡'], 'Insert': ['直接插入'],'Shell': ['希尔'],
13+
'Select': ['直接选择'],'Quick': ['快速'], 'Heap': ['堆'],
14+
'Merge': ['归并'], 'sorted': ['Python自带'], 'Radix': ['基数']}
15+
16+
# 直接插入排序
17+
def Insert(listdata):
18+
for i in range(1, len(listdata)):
19+
# 设置当前值前一个元素的标识
20+
j = i - 1
21+
# 如果当前值小于前一个元素,则将当前值作为一个临时变量存储,将前一个元素后移一位
22+
if listdata[i] < listdata[j]:
23+
temp, listdata[i] = listdata[i], listdata[j]
24+
# 继续往前寻找,如果有比临时变量大的数字,则后移一位,直到找到比临时变量小的元素或者达到列表第一个元素
25+
j = j - 1
26+
while j >= 0 and listdata[j] > temp:
27+
listdata[j + 1] = listdata[j]
28+
j = j - 1
29+
# 将临时变量赋值给合适位置
30+
listdata[j + 1] = temp
31+
return listdata
32+
33+
# 希尔排序
34+
def Shell(listdata):
35+
n = len(listdata)
36+
# 希尔增量
37+
gap = int(n / 2)
38+
while gap > 0:
39+
# 按增量进行直接插入排序
40+
for i in range(gap, n):
41+
j = i
42+
# 直接插入排序
43+
while j >= gap and listdata[j - gap] > listdata[j]:
44+
listdata[j - gap], listdata[j] = listdata[j], listdata[j - gap]
45+
j -= gap
46+
# 得到新的增量
47+
gap = int(gap / 2)
48+
return listdata
49+
50+
# 直接选择排序
51+
def Select(listdata):
52+
for i in range(len(listdata) - 1):
53+
minnum = i
54+
for j in range(i + 1, len(listdata)):
55+
if listdata[j] < listdata[minnum]:
56+
minnum = j
57+
listdata[i], listdata[minnum] = listdata[minnum], listdata[i]
58+
return listdata
59+
60+
# 堆排序
61+
def adjust_heap(lists, i, size):
62+
lchild = 2 * i + 1
63+
rchild = 2 * i + 2
64+
max = i
65+
if i < size / 2:
66+
if lchild < size and lists[lchild] > lists[max]:
67+
max = lchild
68+
if rchild < size and lists[rchild] > lists[max]:
69+
max = rchild
70+
if max != i:
71+
lists[max], lists[i] = lists[i], lists[max]
72+
adjust_heap(lists, max, size)
73+
74+
# 创建堆
75+
def build_heap(lists, size):
76+
for i in range(0, (int(size/2)))[::-1]:
77+
adjust_heap(lists, i, size)
78+
79+
# 堆排序
80+
def Heap(lists):
81+
size = len(lists)
82+
build_heap(lists, size)
83+
for i in range(0, size)[::-1]:
84+
lists[0], lists[i] = lists[i], lists[0]
85+
adjust_heap(lists, 0, i)
86+
return lists
87+
88+
# 基数排序
89+
def Radix(listdata):
90+
k = len(str(max(listdata))) # k获取最大位数
91+
for k in range(k): # 遍历位数,从低到高
92+
s = [[] for i in range(10)] # 生成存放数的十个桶
93+
for i in listdata: # 遍历元素
94+
s[i // (10 ** k) % 10].append(i) # 分桶
95+
listdata = [a for b in s for a in b] # 合并桶
96+
return listdata
97+
98+
# 归并排序
99+
def Merge(listdata):
100+
n = len(listdata)
101+
102+
if n == 1:
103+
return listdata
104+
mid = n // 2
105+
106+
# 对分割的左半部分进行归并排序
107+
leftdata = Merge(listdata[:mid])
108+
# 对分割的右半部分进行归并排序
109+
rightdata = Merge(listdata[mid:])
110+
111+
# 对排序之后的两部分进行合并
112+
# 定义两个游标
113+
left, right = 0, 0
114+
115+
merge_result_li = []
116+
left_n = len(leftdata)
117+
right_n = len(rightdata)
118+
119+
while left < left_n and right < right_n:
120+
if leftdata[left] <= rightdata[right]:
121+
merge_result_li.append(leftdata[left])
122+
left += 1
123+
else:
124+
merge_result_li.append(rightdata[right])
125+
right += 1
126+
127+
merge_result_li += leftdata[left:]
128+
merge_result_li += rightdata[right:]
129+
130+
# 将合并后的结果返回
131+
return merge_result_li
132+
133+
# 冒泡排序
134+
def Bubble(listdata):
135+
for i in range(len(listdata) - 1): # 这个循环负责设置冒泡排序进行的次数
136+
for j in range(len(listdata) - i - 1): # j为列表下标
137+
if listdata[j] > listdata[j + 1]:
138+
listdata[j], listdata[j + 1] = listdata[j + 1], listdata[j]
139+
return listdata
140+
141+
# 快速排序
142+
def Quick(listdata):
143+
if len(listdata) == 0:
144+
return []
145+
pivots = [x for x in listdata if x == listdata[0]]
146+
lesser = Quick([x for x in listdata if x < listdata[0]])
147+
greater = Quick([x for x in listdata if x > listdata[0]])
148+
return lesser + pivots + greater
149+
150+
# 最终的主程序
151+
if __name__ == "__main__":
152+
numpdata = np.arange(1, 100000)
153+
count = [5, 50, 500, 5000, 50000]
154+
# 不同数组长度,每种排序算法运行50次的平均值得对比
155+
colu = ['排序'] + ['%s条' % f for f in count]
156+
x = PrettyTable(colu)
157+
x.title = '不同算法用时(毫秒)对比,随机取数区间[1, 100000]'
158+
for pa in paidict:
159+
print(pa)
160+
timep = []
161+
for ci in count:
162+
np.random.shuffle(numpdata)
163+
ldata = list(np.random.choice(numpdata, ci))
164+
start = time.clock()
165+
result = eval(pa)(ldata)
166+
end = time.clock()
167+
if result == sorted(ldata):
168+
timep.append('%.5f' % ((end - start) * 1000))
169+
else:
170+
print('排序算法:%s错误' % pa)
171+
x.add_row([paidict[pa][0]] + timep)
172+
print(x)
173+
174+
175+
176+
177+
178+

0 commit comments

Comments
 (0)