python 冒泡排序和选择排序

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)

你可能感兴趣的:(python)