码迷,mamicode.com
首页 > 编程语言 > 详细

【算法与数据结构】--经典排序算法Python实现

时间:2020-06-25 13:29:48      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:初始   pytho   strftime   有序   oca   while   经典   转换   sele   

2020.6.25 周四更新

冒泡排序、选择排序、插入排序、希尔交换式排序、希尔移位式排序

持续更新

------------------

下面是以上排序的Python代码:

  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] < self.arr[j-gap]:  # 如果同一组中后一个值小于前一个值,则给当前值继续寻找合适的位置
 93                     while j-gap >= 0 and temp < self.arr[j-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实现

标签:初始   pytho   strftime   有序   oca   while   经典   转换   sele   

原文地址:https://www.cnblogs.com/DJames23/p/13191370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!