前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >05-选择排序

05-选择排序

作者头像
xbhog
发布2019-10-22 17:25:26
3720
发布2019-10-22 17:25:26
举报
文章被收录于专栏:开发技能乱炖开发技能乱炖

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_43908900/article/details/102556912

选择排序算法的原理:

选择排序是从冒泡排序演化而来的,每一轮(趟)比较出最小的那个值,放到第一个位置,然后在每轮的无序区中选出最小的值放到第二个位置。

目的:从小到大排序

图示:

在这里插入图片描述
在这里插入图片描述

算法的关键点是:有序区跟无序区、无序区最小的位置

首先我们写一个简单的选择排序,用到python的内置模块:

代码语言:javascript
复制
#思路是我们创建一个新列表,将原列表中的最小数选出后添加到新列表的中,实现排序。
#定义一个简单的选择排序
def select_sort_simple(li):
    list_new = []
    for i in range(len(li)):
        min_num = min(li)
        list_new.append(min_num)
        li.remove(min_num)
    return list_new

li = [2,5,1,7,4,9,3,0]
print(select_sort_simple(li))

结果:[0, 1, 2, 3, 4, 5, 7, 9]

缺点:

  • 我们生成了一个新的列表,原来需要1G内存的列表,现在需要2G内存,且复杂度增加
  • 里面使用的min\remove复杂度都不是O(1),而是O(n),(remove(O(n)):remove删除元素后,后面元素需要补齐)-----该程序的复杂度为O(n^2)

回归主线,使用代码解释选择排序算法,我们的需求是什么===》不产生新列表,并且每趟将原列表无序区中最小的数放在第一个位置、第二个位置…

换种说法就是先找出原列表的最小值然后与列表的第一个位置上的元素进行交换。

最多需要N趟,每趟出来一个数,但是N-1趟结束后,无序区只剩一个数不要走一边,所以我们最多需要N-1趟,每一趟都需要便利无序区,无序区的范围是:第0趟:从0到最后,第1趟:从1到最后,…所以无序区的范围:i+1 — len(i)。

我们还需要记录最小值的位置:min_loc = i(假定无序区的第一个位置为最小值)

代码语言:javascript
复制
#选择排序的优解
def select_sort(li):
    for i in range(len(li)-1):
        min_loc = i
        for j in range(i+1,len(li)):
            if li[j] < li[min_loc]: #无序区第一个数小于最小值
                min_loc = j #赋值
        li[min_loc],li[i] = li[i],li[min_loc] #两个数交换
        print(li)

li = [2,5,1,7,4,9,3,0]
print(li)
select_sort(li)

结果:

代码语言:javascript
复制
[2, 5, 1, 7, 4, 9, 3, 0]
[0, 5, 1, 7, 4, 9, 3, 2]
[0, 1, 5, 7, 4, 9, 3, 2]
[0, 1, 2, 7, 4, 9, 3, 5]
[0, 1, 2, 3, 4, 9, 7, 5]
[0, 1, 2, 3, 4, 9, 7, 5]
[0, 1, 2, 3, 4, 5, 7, 9]
[0, 1, 2, 3, 4, 5, 7, 9]
学习网站、分享及成功:http://www.xbhog.cn
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 学习网站、分享及成功:http://www.xbhog.cn
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档