python随想之python中的排序问题(选择,冒泡)

关于python中的循环嵌套
现在来一点开胃小菜,打印一下小星星

# 外层循环控制打印多少行
for i in range(1, 11):
    # print('*' * i)
    # 内存循环控制每一行多少个
    for j in range(i):
        print('*', end=' ')
    print()

列表排序实现,冒泡排序法思路(升序排序)

lt = [8, 3, 6, 9, 5, 2, 4, 1, 7]
第一轮:[3, 6, 8, 5, 4, 1, 7, 9]
第二轮:[3, 6, 5, 4, 1, 7, 8, 9]
第三轮:[3, 5, 4, 1, 6, 7, 8, 9]

经过三轮的比较应该能看出来冒泡排序的思想

冒泡排序其实就是两两比对,即第一个和第二个比,第二个和第三个比…如果前面的比后面的大就交换位置。这样一轮比对下来最大的数就会排到最后面了,然后第二轮、第三轮…对比到最后最小的数就会排到最前面…
我们写一下参考示例

# 冒泡排序:升序排序
lt = [8, 3, 6, 9, 5, 2, 4, 1, 7]
n = len(lt)
# 外层循环控制排序多少轮
for i in range(n-1):
    # 内存循环控制相邻两个元素的比较
    for j in range(n-1-i):
        if lt[j] > lt[j+1]:
            # 通用交换元素方式
            # temp = lt[j]
            # lt[j] = lt[j+1]
            # lt[j+1] = temp
            # python中特有方式
            lt[j], lt[j+1] = lt[j+1], lt[j]

print(lt)

关于代码的解析:
1.第一个for循环控制循环多少轮,最大的最后一轮的时候其实都已经排序完毕了,不需要再排了,所以只需要排len(lt)-1次。
2.第二个for循环控制相邻两个元素的比较,因为外层对比len(lt)-1次,而第二次的时候最后一个经是最大的,所以第二次只需要对比len(lt)-1-1次,同理第三次为len(lt)-1-2次…
3. 然后对控制对比次数的j循环进行对比。如果前面的大于后面则进行交,最后的到排序完成的列表,但是运算复杂,时间复杂度高

选择排序
思路:先取出一个位置,用该位置的元素与后面的所有元素挨个比较,不合适就发生交换。

示例:lt = [8, 3, 6, 9, 5, 2, 4, 1, 7]
	第一轮:1, 8, 6, 9, 5, 3, 4, 2, 7
	第二轮:1, 2, 8, 9, 6, 5, 4, 3, 7
	第三轮:1, 2, 3, 9, 8, 6, 5, 4, 7

选择排序的思路:
选择排序是定死第一个数,用这个数与剩余的每个数进行对比,大的放在后面,一次向下进行比对,这样最后就会得到最小的数放在第一个位置,第二轮定死为第二个,与剩下的再进行对比…最后最大的就会放到最后,排序完成

lt = [8, 3, 6, 9, 5, 2, 4, 1, 7]
n = len(lt)
for i in range(n-1):
    index = i
    for j in range(i+1,n-1):
        if lt[index] > lt[1+j]:
            index = j+1
            lt[i], lt[index] = lt[index], lt[i]
print(lt)

你可能感兴趣的:(python)