美文网首页
排序算法集合

排序算法集合

作者: Hmcf | 来源:发表于2019-12-23 15:01 被阅读0次
冒泡排序

一般情况下,冒泡排序都是来两次大循环就能排好序,但是在要求性能的情况下,也是可以优化的,避免很多无用的循环遍历。

有两个优化点:

  • 大部分已经有序了,设置剩余无序的边界
  • 全部有序了,退出循环,结束
def bubble_sort(data_list):
    # 时间复杂度最大的情况下需要循环的次数
    run_cnt = len(data_list)

    # 初始化最后一次交换数据的位置,如果没有交换的话说明后面的已经是有序的了,
    # 避免了下一次大循环中再做无用功
    last_exchange_index = 0

    # 初始化循环的边界值,默认是到最后一个
    sortborder = run_cnt - 1

    for i in range(run_cnt):
        # 初始化整个序列为有序,如果发生了交换,说明是无序的,继续循环排序
        isSorted = True
        for j in range(sortborder):
            if data_list[j] > data_list[j + 1]:
                data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
                # 发生了交换,设置为false,继续遍历
                isSorted = False
                # 发生了交换,设置最后一次的交换位置
                last_exchange_index = j
                
        # 将最后一次的交换位置赋值给循环的边界,下一次的排序,只需要比较到边界处即可
        sortborder = last_exchange_index
        
        # 如果在这一次的排序过程中没有发生数据交换,则说明整个序列已经排好序了,可以直接退出
        if isSorted:
            break


data_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
bubble_sort(data_list)
print(data_list)

# 避免重复无用排序的isSorted测试用例
# 【5, 8, 6, 3, 9, 2, 1, 7】

# 无序边界测试last_exchange_index用例
# [3, 4, 2, 1, 5, 6, 7, 8]

快速排序

遍历队列,每次找到最大或最小的元素,放到队列的首端或尾端。

def quick_sort(data_list):
    run_cnt = len(data_list)

    for i in range(run_cnt - 1):
        min_index = i
        for j in range(i+1, run_cnt):
            min_index = j if data_list[j] < data_list[min_index] else min_index
        data_list[min_index], data_list[i] = data_list[i], data_list[min_index]


data_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
quick_sort(data_list)
print(data_list)

相关文章

网友评论

      本文标题:排序算法集合

      本文链接:https://www.haomeiwen.com/subject/sniznctx.html