选择排序

选择排序

描述:

选择排序(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)))

原文地址:https://www.cnblogs.com/amou/p/8992257.html