1 import random
2 list1 = [1,2,3,4,5,6,7,8,9,10]
3 # list1 = [i for i in range(1,11)]
4 random.shuffle(list1)
5 print('排序前',list1)
6 # 1.冒泡排序
7 """
8 思路:
9 前提:一个列表内操作,一个列表!!一个列表!!!
10 左边未排序(列表左半部分),右边有序序列(列表右半部分)
11
12 乱序 有序
13 1-10 空
14 1-9 10
15 1-8 9,10
16 1-7 8,9,10
17 。。。
18 1 2-10
19 共计9次
20
21 在乱序部分 从前往后,两两比较元素,降序则互换位置,
22 将两者较大值,继续与后续元素比较,
23 最后乱序中最大值置于最右端
24
25 """
26 def bubble_sort(lis):
27 leng = len(lis)
28 for i in range(1, leng): # 循环9次
29
30 # 循环次数-- leng-1,剩余的一个就是最小值,不需要再移动【两块,一块未排序|一块已排序】
31 # 每次循环将一个未排序序列最大值移动到最后
32 #最大值的确定
33 #遍历列表亮亮比较,降序则对调
34 j = 0
35 while j < leng - i:
36 #在乱序部分两两比较
37 #i为循环次数,
38 #寻找乱序部分最大值
39
40
41 if lis[j] > lis[j + 1]:
42 lis[j], lis[j + 1] = lis[j + 1], lis[j]
43 j += 1
44 print(f'冒泡排序第{i}次循环-->',lis)
45 return lis
46
47 print('冒泡排序后',bubble_sort(list1))
48
49 #########################################################################
50 #2.选择排序
51 """
52 分为排序序列、未排序序列两部分
53
54 ①未排序序列中找到最小(大)元素,存放到排序序列的起始位置
55 以找最小值(升序)为例
56 排序序列 未排序序列
57 空 乱序1-10
58 1 乱序2-10
59 ②剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
60 ③以此类推...
61
62 排序序列 未排序序列
63 1 乱序2-10
64 1,2 乱序3-10
65 1,2,3 乱序4-10
66 1,2,3,4 乱序5-10
67 ....
68 1-9 10
69
70 n个数据(记录)经过n-1趟得到有序结果
71
72 升序代码思路:
73 n-1次循环
74 每次循环中,在未排序序列中找到最小值,
75 找最小值的方法--》记录未排序序列第一个值作为比较值,遍历未排序序列与为比较值比较大小,小则作为比较值作后续的比较
76 最小值与未排序序列第一个元素互换值
77 """
78 def select_sort(lis):
79 length = len(lis)#10
80 for i in range(length-1): # 9次循环,i->0-8,未排序序列首元素索引0-8
81 min_index = i
82 for j in range(i+1,length):#j--> 1-9【与0比较】,2-9【与1比较】,3-9【与2比较】
83 if lis[j] < lis[min_index]:
84 min_index = j
85 lis[i],lis[min_index] = lis[min_index],lis[i]
86 return lis
87
88 # list2 = select_sort(list1)
89 # print('排序后',list2)
90
91 ##########################################
92 #3插入排序
93
94 """
95 工作原理:
96 分有序,无序两序列【一个列表】,对于未排序数据,
97 在已排序序列中从后往前扫描,找到相应位置并插入
98
99 算法描述
100 第一个元素可以认为已经被排序
101 循环n-1次--》for循环
102 每次循环中
103 取出无序序列第一个元素a,在有序序列中从后往前扫描
104 如果--》if 有序序列元素大于a,则有序元素后移
105 直到排序元素等于a或者小于a,或者a排到第一个,结束扫描
106 将新元素插入到该位置
107 """
108 def insert_sort(lis):
109 length = len(lis)
110 #9次循环
111 for i in range(1,length): # i 1-9
112 #无序序列首元素索引1-9,值lis[i]
113 head_value = lis[i] # 无序元素的值
114 # head_index = i
115 # for j in range(head_index-1,-1,-1):
116 for j in range(i - 1, -1, -1):
117 #j是比较元素索引,有序序列末元素到0,无序首元素跟有序元素从后往前比较
118 # 有序元素lis[j],无序首元素head_value
119 if lis[j] > head_value:
120 lis[j+1] = lis[j]
121 if j == 0:
122 #排到有序首位时插入到此位置
123 lis[j] = head_value
124 else:
125 #排序元素小于等于无序首元素a时,插入到此位置
126 lis[j+1] = head_value
127 break
128 print(f'插入排序第{i}次循环',lis)
129 return lis
130 list2 = insert_sort(list1)
131 print('插入排序结果',list2)