排序 1

来源:互联网 发布:战士公主西娜 知乎 编辑:程序博客网 时间:2024/06/06 21:44

参考:

排序 0 - 前言

百度百科:选择排序


选择排序(selection sort)

工作原理

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

算法思想

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


Python 算法实现

# -*- coding: utf-8 -*-"""选择排序"""import randomdef 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 liif __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)

原创粉丝点击