首页 > 编程语言 >【算法实践】有始有终,雨露均沾--手把手带你手撸选择排序

【算法实践】有始有终,雨露均沾--手把手带你手撸选择排序

时间:2022-12-19 13:31:16浏览次数:47  
标签:arr 有始有终 -- 手把手 元素 交换 最小 序列 排序

前言

选择排序是一个非常经典且简单直观的排序算法,无论什么数据进去都是 O(n^2) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。其排序时,元素交换次数最差的情况为n−1次。选择排序的原理是先固定每个元素的位置,在序列中找到最小的元素,将这个元素与第一个元素交换位置,其次是除去第一个元素,找到剩余序列中最小的元素,与第二个元素交换位置,以此类推,直到所有的元素排完,就能实现选择排序,所以说选择排序是有始有终,雨露均沾的一个算法,哈哈~

选择排序的基本思想是:每一趟在n−i+1 ( i = 1 , 2 , . . . , n − 1 ) 个元素中选择最小的元素,并将其作为有序序列中第i个元素。也就是从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。

所以具体的操作就是:选择排序在开始的时候,先扫描整个列表,以找到列表中的最小元素,然后将这个元素与第一个元素进行交换。这样最小元素就放到它的最终位置上。然后,从第二个元素开始扫描,找到n-1个元素中的最小元素,然后再与第二个元素进行交换。以此类推,直到第n-1个元素(如果前n-1个元素都已在最终位置,则最后一个元素也将在最终位置上)。接下来我们按步骤来厘清它的操作:

算法步骤

  1. 定义一个数组序列,获取序列长度length
  2. 首先在未排序序列中找到最小元素,存放到排序序列的起始位置。也就是把找到的最小元素和序列中的第一个元素交换位置。
  3. 再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。
  4. 以此类推,重复第三步,直到所有元素均排序完毕。
  5. 输出排序结果

【算法实践】有始有终,雨露均沾--手把手带你手撸选择排序_选择排序

操作流程

选择排序很简单,就是很执着地在找最小元素,整个流程如下图:

【算法实践】有始有终,雨露均沾--手把手带你手撸选择排序_图解排序_02

动图演示

这是在网上找到的一张动图演示,很生动,很直观展现了选择排序的整个过程,

【算法实践】有始有终,雨露均沾--手把手带你手撸选择排序_数据_03

选择排序就是通过数据移动实现的,如果有的元素已经在正确的位置上(即是已经排好序),则不会发生数据的交换,如果发生数据交换,那么两个元素至少有一个被交换到正确的位置上,所以,对n个元素进行选择排序。最多交换n-1次。

算法实现

方法1:

1.输入一个待排序的列表arr = [6,5,2,9,8]

arr = [6,5,2,9,8] 
print('待排序数组:',arr)
length = len(arr)
for i in range(length):
print("第{i}轮排序".format(i=i+1))
for j in range(length):
if arr[j] > arr[i]:
arr[i], arr[j] = arr[j], arr[i]
print(arr)

print("完成排序的数组:", arr)

执行结果:

【算法实践】有始有终,雨露均沾--手把手带你手撸选择排序_选择排序_04

方法2:减少的交换操作

def selectSort(arr):
for i in range(len(arr) - 1):
minIndex = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[minIndex]:
minIndex = j
#当i不是最小元素时,将i和最小的元素进行交换
if i != minIndex:
arr[i], arr[minIndex] = arr[minIndex], arr[i]

#记录排序步骤
print("第{i}轮排序".format(i=i + 1))
print(arr)

return arr
arr1 = [6,5,2,9,8]
print("完成排序的数组:",selectSort(arr1))

执行结果:

【算法实践】有始有终,雨露均沾--手把手带你手撸选择排序_图解排序_05

总结

选择排序使用了线性查找来寻找最小值,因此在第一轮中需要比较n-1个元素,第二轮需要比较n-2个元素,直到第n-1轮时就只需要比较一个元素,所以,总的比较次数和冒泡排除相同,都是(n-1)+(n-2)+...+1=n^2/2 次;每轮交换元素的次数最多为1次,如果输入的数据就是按从小到大排列的,那就无需进行任何交换,选择排序的时间复度也和冒泡排序一样,都是O(n^2)

标签:arr,有始有终,--,手把手,元素,交换,最小,序列,排序
From: https://blog.51cto.com/micai01/5951966

相关文章

  • Spring LDAP参考
    SpringLDAP使得构建使用LightweightDirectoryAccess协议的基于Spring的应用程序变得更加容易。本文档的副本可以制作供您自己使用和分发给他人,前提是您不对此类副本......
  • Kodi v20 "Nexus" RC1 发布,开源跨平台媒体播放器
    Kodiv20"Nexus"RC1发布,开源跨平台媒体播放器来源:OSCHINA编辑: 局2022-12-1907:36:00 0Kodi是由XBMC基金会开发的开源媒体播放器,原名XBMC(最后......
  • ABAP-公司间交易平台开发
    项目:公司间交易平台开发背景:物流园区工厂A向工厂B采购,要以贸易公司位中转方,之前是工厂A给贸易公司下采购订单,然后贸易公司下销售订单,然后贸易公司向工厂B下采购订单......
  • (For Final Exam)计算机组成原理期末复习
    概述1.两种信息流:数据信息流,控制信息流\(\left\{\begin{aligned}指令信息\\状态信息\\时序信息\end{aligned}\right.\)2.五个部件:运算器,存储器,控制器,输入设备......
  • Controller 层代码就该这么写,简洁又优雅!
    来源:https://juejin.cn/post/7123091045071454238一个优秀的Controller层逻辑说到Controller,相信大家都不陌生,它可以很方便地对外提供数据接口。它的定位,我认为是「不......
  • 29csv文件读写_and_excel转化csv
    csv文件读写链接地址:csv文件的写入与读取excel文件转化csv格式importpandasaspddata=pd.read_excel('123.xls','Sheet1',index_col=0)data.to_csv('data.csv',ind......
  • 30python中列表-字典-字符串-三目运算符
    好文手敲下,每天码代码~加油三目运算符a=1b=2#a+b不大于3执行后面的else语句b-a=1print(a+bifa+b>3elseb-a)一、列表1.1列表的定义​ 白话来讲:放数......
  • CF--783--D
    D.OptimalPartition/*if(sum[i]-sum[j]>0)f[i]=max(f[j]-j)+i;if(sum[i]==sum[j])f[i]=max(f[j]);if(sum[i]-sum[j]<0)f[i]=max(f[j]+j)-i;所以f[i]的更新是只......
  • 详解如何将卫星影像或者航拍正射影像添加到Auto CAD中?
    在工程设计施工过程中,我们需要将项目现场的影像数据导入CAD,将卫星影像按1:1等比例且带坐标导入CAD中,作为设计参考底图来辅助我们的设计绘图。这里我们分享一个免费的工具-......
  • Calibre 6.10 发布,功能强大的开源电子书工具
    Calibre6.10发布,功能强大的开源电子书工具来源:OSCHINA编辑: Alias_Travis2022-12-1807:15:22 1Calibre开源项目是Calibre官方出的电子书管理工具......