数据结构之内部排序--简单选择排序

概要

-IDE:Pycharm
-Python版本:python3.x
-算法分类:内部排序->选择类排序->简单选择排序

算法思想

第一趟简单选择排序时,从第一个记录开始,通过 n1 n − 1 次关键字比较,从 n n 个记录中选出关键字最小的记录,并和第一个记录进行交换。
第二趟,从第二个记录开始,通过n2次比较,选出最小的与第二个记录交换。
反复如此,经过 n1 n − 1 次简单选择排序,将把 n1 n − 1 个记录排到位,剩下的一个最小记录直接在最后,所以共需进行 n1 n − 1 趟简单选择排序。

算法分析

最好情况下,即待排序记录初始状态是正序,则不需要移动记录,最坏情况是倒序,此时移动的最多为 3(n1) 3 ( n − 1 ) 次。
简单选择排序过程中需要进行的比较次数与初始状态无关,总共需要比较 n1i=1=(n1)+(n2)+...+1=n(n1)2 ∑ i = 1 n − 1 = ( n − 1 ) + ( n − 2 ) + . . . + 1 = n ( n − 1 ) 2

稳定性与时间复杂度

排序算法稳定性时间复杂度最好情况最坏情况空间复杂度
简单选择不稳定 O(n2) O ( n 2 ) O(n2) O ( n 2 ) O(n2) O ( n 2 ) O(1) O ( 1 )

Python代码清单

# !/usr/bin/python3
# _*_ coding:utf-8 _*_
# 选择排序。

import sys, time, random


def SS(number, maxNumber):
    timeStart = time.time()  # 记录开始时间。
    listA = []  # 设置list容器
    for i in range(number):  # 循环生成列表元素
        listA.append(random.randint(0, maxNumber))  # 添加到列表

    timeEnd = time.time()  # 记录结束时间
    tiemIs = timeEnd-timeStart  # 计算耗时
    print('生成%d个数花费的时间是%f' % (number, tiemIs))  # 打印信息。
    # print(listA)  # 打印生成的列表。
    ############################################################
    # 快速排序。
    # aim = 0  # aim 用于存储找到的最小值。
    timeStart = time.time()  # 记录开始时间。
    for item in range(number-1):  # 外层循环,
        i = item  # 记录当前元素位置,也是目标位置,也是第一个比较元素。
        temp = listA[i]  # 记录当前元素的值
        for item2 in range(item+1, number):  # 内层循环。
            if listA[item2] < listA[i]:  # 判断的大小。
                i = item2  # 更新比较元素。
        listA[item] = listA[i]  # 将最小的元素放到目标位
        listA[i] = temp  # 将目标位的元素送到当前位。
        # print(listA[item])
    timeEnd = time.time()  # 记录结束时间。
    timeIs = timeEnd - timeStart  # 计算消耗时间。
    print('排序%d个数花费的时间是%f' % (number, timeIs))  # 打印输出相关信息。
    # print(listA)  # 打印输出列表。


if __name__ == '__main__':

    helpInfo = '''
        This program is for Select Sort.
        How to use it! Follow the example!

        python Select_Sort.py 10 100

        The 10 representative will generate ten numbers.
        100 representative the max-number you make.

    '''
    command = sys.argv[0:]  # 从键盘上获取输入。
    if len(command) != 3 or 'help' in command:  # 判断输入是否合法,或者有请求帮助的词。
        print(helpInfo)  # 打印帮助语句。
    else:
        try:
            number = int(command[1])  # 尝试将字符转化为int型数值。
            maxNumber = int(command[2])
        except ValueError:  # 转化失败,发生ValueError。
            print(helpInfo)  # 打印帮助文本。
            sys.exit(1)  # 以异常的方式退出程序
        SS(number, maxNumber)  # 一切正常,开始调用函数。

有什么问题请联系我

QQ:3116316431 (请附上信息)
E-mail:wongyinlong@yeah.net

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值