冒泡,选择,插入排序的python实现

  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)

 

posted @ 2018-10-09 22:21  dmyHero  阅读(116)  评论(0)    收藏  举报