排序 1 - 选择排序

参考:

排序 0 - 前言

百度百科:选择排序


选择排序(selection sort)

工作原理

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置(或末尾),直到全部待排序的数据元素排完。

算法思想

设待排序序列大小为 n,从头到尾共遍历 n-1 次,i 表示当前遍历的次数,也表示已排序序列的终止位置和待排序序列的起始位置,从下标 i 开始在待排序序列中找出最小(或最大)的元素的下标 k,其值和下标 i 的值进行交换


Python 算法实现

# -*- coding: utf-8 -*-

"""
选择排序
"""

import random


def create_data(leng, min, max):
    """
    创建待排序序列
    :param leng: 序列长度
    :param min: 最小值
    :param max: 最大值
    :return: 列表
    """
    li = range(min, max)
    return random.sample(li, leng)


def selection_sort(li, reverse=False):
    """
    选择排序实现
    :param li: 待排序列表
    :param reverse: 是否从大到小排序,默认为False
    :return: 已排序列表
    """
    for i in xrange(len(li) - 1):
        k = i
        for j in xrange(i + 1, len(li)):
            if reverse:
                if li[k] < li[j]:
                    k = j
            else:
                if li[k] > li[j]:
                    k = j
        li[k], li[i] = li[i], li[k]

    return li


if __name__ == '__main__':
    da = create_data(10, 30, 60)
    print da
    selection_sort(da, True)
    print da

性能分析

稳定性

选择排序是不稳定排序算法

比如待排序序列为 (4,0),(4,1),(2,2)

第一次遍历后,结果为 (2,2),(4,1),(4,0)

那么值为 4 的两个元素的相对位置在排序完成后发生了变化,所以选择排序是不稳定算法

时间复杂度

基本操作为

...
    k = i
    ...
        ...
                k = j
        ...
                k = j
    li[k], li[i] = li[i], li[k]

return li

T(n) = (n-1) + n*(n-1)/2 + (n-1)

最好,最坏,平均时间复杂度均为 O(n^2)

空间复杂度

仅使用了变量 k,所以空间复杂度为 O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值