1.python中冒泡法:
第一层循环边界为(length-1),python中range()的范围是前闭后开
第一次循环两两数字比较,前一个数字比后一个大,两数字发生交换,直到到列表最后(最后的数字最大)
第二次循环和第一次一样,最后一个数字不用比较,依次类推第二层循环的边界为(length-i)
#········1········常用方法
#升序排列,使用冒泡法
lst = [3, 4, 2, 9, 5, 6, 7, 8, 1]
length = len(lst)
for i in range(length): #n
for j in range(1, length - i): #n
if lst[j -1] > lst[j]: #前一个数比后一个数大,就交换位置
lst[j - 1], lst[j] = lst[j], lst[j - 1] #封装,解构
print(lst)
优化:如果列表顺序已经排列好,第一次循环时发现位置没有交换,就知道列表已经按照升序排列了
#·········2·········打标记,发生交换就标记为1,否则标记为0
lst = [3, 4, 2, 9, 5, 6, 7, 8, 1]
#lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
length = len(lst)
for i in range(length):
count = 0
for j in range(1, length - i):
if lst[j - 1] > lst[j]:
lst[j -1], lst[j] = lst[j], lst[j -1]
count =1
if count ==0:
break
print(lst)
选择排序一元排序,从中挑选最大数,最大数放最前,依此类推
lst = [3, 4, 2, 9, 5, 6, 7, 8, 1]
length = len(lst)
for i in range(length):
maxindex = i #每次循环默认一个当前最大数的索引
for j in range(i + 1, length):
if lst[j] > lst[maxindex]:
maxindex = j #如果其他数比当前最大数大,该数索引变为当前最大
if i !=maxindex: #如果索引不是当前索引,就发生交换
lst[i], lst[maxindex] = lst[maxindex], lst[i]
print(lst)
选择排序二元排序
lst = [3, 4, 2, 9, 5, 6, 7, 8, 1]
length = len(lst)
for i in range(length // 2):
maxindex = i #每次循环默认一个当前最大数的索引
minindex = -i -1##每次循环默认一个当前最小数的负索引
for j in range(i + 1, length):
if lst[j] > lst[maxindex]:
maxindex = j #如果其他数比当前最大数大,该数索引变为当前最大
if lst[minindex] > lst[-j -1]:
minindex = -j - 1 #
if i != maxindex:
lst[i], lst[maxindex] = lst[maxindex], lst[i]
if i == minindex or i == length + minindex: #如果最小的数被交换过,就更新索引
minindex = maxindex
if -i -1 != minindex:
lst[-i - 1], lst[minindex] = lst[minindex], lst[-i - 1]
print(lst)