【算法与数据结构】--经典排序算法Python实现
2021-05-06 01:31
标签:初始 pytho strftime 有序 oca while 经典 转换 sele 2020.6.25 周四更新 冒泡排序、选择排序、插入排序、希尔交换式排序、希尔移位式排序 持续更新 ------------------ 下面是以上排序的Python代码: 【算法与数据结构】--经典排序算法Python实现 标签:初始 pytho strftime 有序 oca while 经典 转换 sele 原文地址:https://www.cnblogs.com/DJames23/p/13191370.html 1 import numpy as np
2 import time
3
4 class Sort:
5 def __init__(self, arr):
6 self.arr = arr
7
8 def bubblesort(self):
9 # 冒泡排序
10 count = 0
11 flag = False # 优化冒泡排序,当一次循环没有任何交换时就退出
12 for i in range(len(self.arr)-1):
13 for j in range(len(self.arr)-1-i):
14 if self.arr[j] > self.arr[j+1]:
15 flag = True
16 temp = self.arr[j]
17 self.arr[j] = self.arr[j+1]
18 self.arr[j+1] = temp
19 #print(‘冒泡排序第%d次排序的结果为‘ % (i+1), self.arr)
20 if flag == False:
21 return self.arr,count # 如果flag为false,说明此次排序没有任何交换,即已经排好顺序
22 else:
23 count +=1
24 flag = False # 置为false,进行下一次排序
25 return self.arr, count
26
27
28 def selectSort(self):
29 # 选择排序,找到最小值及其索引再进行交换
30 k = 0 # 用于记录实际排序的次数
31 for i in range(len(self.arr)-1): # 总共需要排序的次数为len(self.arr)-1
32 min = self.arr[i] # 假定当前的值为最小值
33 minindex = i # 假定当前值的索引为最小值的索引
34 for j in self.arr[i+1:]: # 从当前值的下一个值开始遍历比较
35 if min > j: # 如果当前值大于下一个值,则重置最小值和最小值索引
36 min = j
37 minindex = self.arr.index(j)
38 if minindex != i:
39 self.arr[minindex] = self.arr[i]
40 self.arr[i] = min
41 k += 1
42 #print(‘选择排序第%d次排序的结果为‘ % k, self.arr)
43 return self.arr,k
44
45
46 def insertSort(self):
47 # 插入排序,为每一个待插入的数找到合适的位置
48 k = 0 # 用来记录优化后的排序次数
49 for i in range(len(self.arr)-1): # 需要排序的次数为len(self.arr)-1次
50 insertvalue = self.arr[i+1] # 待插入的数从第2个数开始
51 insertindex = i # 待插入的数要与它前面的数进行比较,这里用来记录前一个值的索引
52 while insertindex >= 0 and insertvalue self.arr[insertindex]:
53 # 满足两个条件,当前面值的索引大于等于0并且待插入的值小于前一个值时说明待插入的值还没有找到合适的位置
54 # 此时需要将前一个数向后移动
55 self.arr[insertindex + 1] = self.arr[insertindex]
56 insertindex -= 1 # 进行下一次判断
57 if (insertindex + 1) != (i+1): # 当本来就有序时则不需要插入
58 k += 1
59 self.arr[insertindex + 1] = insertvalue # 将待插入的值放到合适的位置
60 #print(‘插入排序第%d次排序的结果为‘ % k, self.arr)
61 return self.arr,k
62
63
64 def shellSort(self):
65 # 希尔交换式排序
66 temp = 0 # 交换时的中间变量
67 count = 0 # 记录排序次数
68 gap = len(self.arr)//2 # gap初始值,第一次分组的数量
69 while (gap > 0): # gap分组为1时做最后一次插入排序
70 count += 1
71 for i in range(gap, len(self.arr)): # 遍历gap后的每一个元素
72 for j in range(i-gap, -1, -gap): # 遍历同一组的每一个元素
73 if self.arr[j] > self.arr[j+gap]: # 当同一组元素的前一个值大于后一个值时交换两者位置
74 temp = self.arr[j]
75 self.arr[j] = self.arr[j+gap]
76 self.arr[j+gap] = temp
77
78 #print(‘希尔交换式排序第%d次排序的结果为‘ % count, self.arr)
79 gap //= 2 # 分组增量减少,进行下一次循环
80 return self.arr,count
81
82
83 def shellSort2(self):
84 # 希尔移位式排序
85 count = 0
86 gap = len(self.arr)//2
87 while gap > 0:
88 count += 1
89 for i in range(gap, len(self.arr)):
90 j = i # 记录待插入值的索引
91 temp = self.arr[j] # 记录当前值,待插入的值
92 if self.arr[j] # 如果同一组中后一个值小于前一个值,则给当前值继续寻找合适的位置
93 while j-gap >= 0 and temp gap]:
94 # 满足两个条件,当前一个值的索引大于等于0且待插入的值小于前一个值则将前一个值向后移动
95 self.arr[j] = self.arr[j-gap]
96 j -= gap
97 self.arr[j] = temp # 退出while循环时说明已经为temp找到了合适的位置
98 # print(‘希尔移位式排序第%d次排序的结果为‘ % count, self.arr)
99 gap //= 2
100 return self.arr,count
101
102
103 if __name__ == ‘__main__‘:
104 # arr = [3, -1, 9, 5, 14, -3]
105 np.random.seed(8000) # 设置 8000 个种子
106 random1 = np.random.randint(0,8000000,8000) # 随机生成8000个随机整数
107 random1 = random1.tolist() # 将ndarray转换为list
108 print(type(random1))
109 #for index in range(len(random1)):
110 # print(random1[index])
111 sort1 = Sort(random1) # 实例化对象类
112 print(time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime(time.time()))) # 格式化输出时间
113 start = time.time()
114 resarr,count = sort1.shellSort2() # 调用对象的希尔移位式排序方法
115 end = time.time()
116 print(time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime(time.time())))
117 print(‘排序运行时间为%.5f秒‘%(end-start)) # 计算运行时间
118 print("一共排序%d次"%count)
上一篇:多线程通信
下一篇:单链表(Python)