美文网首页
算法010_选择排序

算法010_选择排序

作者: 为宇绸缪 | 来源:发表于2024-01-09 22:30 被阅读0次

    选择排序
    每次遍历,找到一个最小的数,放到新的列表当中,然后再遍历,再找最小的数放到新列表当中。

    • 一趟排序记录最小的数,放到第一个位置
    • 再一趟排序记录列表无序区最小的数,放到第二个位置
    • 算法关键点:有序区和无序区、无序区最小数的位置
    • 算法复杂度:O(n^2)

    简单版本
    进行列表循环,然后找到最小的把它放到新的列表当中

    def select_sort_simple(target_list):
        new_list = []
        for i in range(len(target_list)):
            min_val = min(target_list)
            new_list.append(min_val)
            target_list.remove(min_val)
        return new_list
    
    
    test_list = [3, 2, 4, 1, 5, 6, 8, 7, 9]
    print("原始的列表: ", test_list)
    print("排序后列表: ", select_sort_simple(test_list))
    

    运行结果

    原始的列表:  [3, 2, 4, 1, 5, 6, 8, 7, 9]
    排序后列表:  [1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    这些写法的问题
    这种写法的问题
    (1)多占一份内存,不是原地排序
    (2)算法复杂度高。因为 removemin 都不是 O(1) 的复杂度,min 是需要遍历一遍才能找到的,remove 删除之后需要把后面的数往前移动,导致算法的复杂度是 O(n^2)removemin 的操作是一个 O(n),然后外层有一个循环,导致复杂度是 O(n^2)

    进阶版
    进阶版:把找出来的值放到列表的第一个位置,然后左边是有序区,右边是无序区
    需要进行 n - 1 趟排序,需要留一个数进行交换,因此是 n - 1

    def select_sort_advanced(target_list):
        for i in range(len(target_list) - 1):  # i是第几趟
            min_location = i  # 记录最小数的索引,是无序区的最后一个数的索引
            for j in range(i + 1, len(target_list)):  # 从 i + 1 开始比较
                if target_list[j] < target_list[min_location]:
                    min_location = j  # 把最小数的下标给 min_location
            # 循环结束,得到最小数的下标,然后进行交换
            if min_location != i:
                target_list[i], target_list[min_location] = target_list[min_location], target_list[i]
    
    
    test_list = [3, 4, 2, 1, 5, 6, 8, 7, 9]
    print("原始的列表: ", test_list)
    select_sort_advanced(test_list)
    print("交换后列表: ", test_list)
    

    运行结果

    原始的列表:  [3, 4, 2, 1, 5, 6, 8, 7, 9]
    交换后列表:  [1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    相关文章

      网友评论

          本文标题:算法010_选择排序

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