专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

数据结构与算法之选择排序

选择排序算法的原理:

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

目的:从小到大排序

图示:

123_1.png

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

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

#思路是我们创建一个新列表,将原列表中的最小数选出后添加到新列表的中,实现排序。
#定义一个简单的选择排序

 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(假定无序区的第一个位置为最小值)

 #选择排序的优解
 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)

结果:

 [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]

文章永久链接:https://tech.souyunku.com/20723

未经允许不得转载:搜云库技术团队 » 数据结构与算法之选择排序

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们