温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用python实现选择排序

发布时间:2022-01-17 09:28:26 来源:亿速云 阅读:173 作者:小新 栏目:大数据

这篇文章主要介绍如何使用python实现选择排序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

选择排序简单理解:以升序来说,在每次遍历待排序数组时,默认首位的元素为最小,然后逐个把剩余元素与该首位元素进行比较,如果小于则二者交换位置,这样遍历完一次数组,就能确定把最小的一个元素放到首位。每次遍历完数组时,均能确定一个相对最小元素,因此相对于上次遍历的数组来说,此次的数组长度减1,即已经确定为最小的元素不再参与后续的遍历,正常情况下经过原数组长度减1次遍历即可完成排序。
def selection_sort(alist):    '''选择排序'''        last = len(alist)    first = 1        while first < last:        print(first)  # 可以理解为第几次遍历        for i in range(first,last):            if alist[i] < alist[first-1]: # 从小到大排列                alist[first-1],alist[i] = alist[i],alist[first-1]        print(alist)   # 每次遍历完的结果                first += 1
   return alist

if __name__ == '__main__':    alist = [2,4,7,1,6,5,3]    print(selection_sort(alist))

        

        代码流程:首先获取数组长度last,初始遍历时,默认0索引位置的元素最小,因此令first为1,first代表的意思是第一个与默认最小值进行比较的元素的索引(比如在进行第一轮遍历时,肯定是索引为1的元素与索引为0的元素比较,后面每轮的遍历类似推理即可);接着进入while循环,这里以开始比较的元素的索引与数组长度作条件判断,小于则进入遍历,否则终止循环(此内容下文针对示例结果具体讲解);对于内部的for循环,注意其范围:后者小于前者交换位置,否则不交换,这里可以看出后者元素的索引减1即为前者元素的索引,还是拿首次遍历来说,当first为1时,其减1则为0,因此实现了第一个元素与默认为最小的0位置的元素的比较,到了第二次遍历时,first为2,其减1为1,可实现2位置的与1位置的比较大小(此时的1为第二次遍历时的数组的首个元素的索引 ‘0’)。。。。依次类推实现排序,在每次遍历完后可通过打印数组来查看每次的结果。first加1,就是由于每遍历一次,待排序的数组长度减1。下面结合示例结果说说:

1   # first值[1, 4, 7, 2, 6, 5, 3]  # 第一次遍历结果2   # first值[1, 2, 7, 4, 6, 5, 3]  # 第二次遍历结果3   # first值[1, 2, 3, 7, 6, 5, 4]  # 第三次遍历结果4   # first值[1, 2, 3, 4, 7, 6, 5]  # 第四次遍历结果5   # first值[1, 2, 3, 4, 5, 7, 6]  # 第五次遍历结果6   # first值[1, 2, 3, 4, 5, 6, 7]  # 第六次遍历结果
[1, 2, 3, 4, 5, 6, 7]  # 最终结果

        

        结果分析:待排序数组长度为7,则只需遍历6次,前6次确定6个元素,则最后一个元素无需比较。当first为6时,6<7,进入循环,比较的是上一轮第五次结果

[1, 2, 3, 4, 5, 7, 6]中的list[6]与list[6-1]的大小,也就是数值7和6交换位置,此时已经却确定好前6个数的位置,剩下最后一个位置的数,接着打印出第六次结果,然后first加1,此时7<7不成立,终止循环,此时的最后一个位置的数不进行比较也是最大的了,返回排序好的数组,结束。

        

        复杂度:选择排序的平均复杂度仍为n**2;最优时间复杂度为n,即原数组为有序数组,遍历第一次时如果未发生交换即可跳出循环,可设定一个变量来记录交换次数详情可参考排序之冒泡排序该文章中的相关做法。

以上是“如何使用python实现选择排序”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI