zoukankan      html  css  js  c++  java
  • 选择排序

    选择排序

    描述:

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

    基本思想:

    第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;
    第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;
    以此类推,
    第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,
    使有序序列不断增长直到全部排序完毕。

    示例:

    以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列
    初始序列:{49 27 65 97 76 12 38}
      第1趟:12与49交换:12{27 65 97 76 49 38}
      第2趟:27不动 :12 27{65 97 76 49 38}
      第3趟:65与38交换:12 27 38{97 76 49 65}
      第4趟:97与49交换:12 27 38 49{76 97 65}
      第5趟:76与65交换:12 27 38 49 65{97 76}
      第6趟:97与76交换:12 27 38 49 65 76 97 完成

    稳定性:

    选择排序是不稳定的排序方法
    ex:
    序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面。

    时间复杂度:

    两个循环
    所以时间复杂度为:O(n^2)

    简洁版:

    def select_sort(li):
        n = len(li)
        for i in range(n - 1):
            min_num = i
            for j in range(i + 1, n):
                if li[min_num] > li[j]:
                    min_num = j
            li[min_num], li[i] = li[i], li[min_num]
        return li
    
    
    

    注释版:

    def select_sort(li):
        n = len(li)
        for i in range(n - 1):
            # 外层循环控制内层循环的次数, 同时也控制内层循环从第几个数开始比较[注],
            # 注: 假设第一次比对完之后, 找到数列中最小的值,
            # 将这个最小值放在数列的第一个位置, 所以下一次比较, 跳过它, 从第二个位置处的元素进行比对
            # 依次类推
    
            min_num = i
            # 比较前, 假设第一个数是最小的, 将它作为被比对的值, 与他后面的元素进行比对
            for j in range(i + 1, n):
                # 从被比对的值的后一位开始比对, 执行到列表的最后一个元素
                if li[min_num] > li[j]:
                    # 如果前者大于后者, 记录后者的坐标
                    min_num = j
            # 循环完成之后, 找到数列中最小的值
            li[min_num], li[i] = li[i], li[min_num]
            # 让这个值与被比对的值, 进行交换
        return li
    
    
    if __name__ == "__main__":
        l = list(i for i in range(0, 1000))
        print("洗牌之前的列表:" + str(l))
        random.shuffle(l)
        print("洗牌之后的列表:" + str(l))
        print("选择排序之后的列表:" + str(select_sort(l)))
    
    
  • 相关阅读:
    念奴娇·登多景楼
    转载《“精”、“气”、“神”解》
    三伏天,人体内有一个“冰箱”
    《抓住“三伏天”习武健身的黄金季节》--胡俭雷
    孙氏内家拳中的桩功
    清净布气门功夫介绍
    孙式太极拳的站桩功--无极式
    [Android Tips] 25. ADB Command Note
    [Python] 删除指定目录下后缀为 xxx 的过期文件
    [Git] Ubuntu 升级 git 版本
  • 原文地址:https://www.cnblogs.com/amou/p/8992257.html
Copyright © 2011-2022 走看看