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

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

前言


选择排序是一个非常经典且简单直观的排序算法,无论什么数据进去都是 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. 输出排序结果


网络异常,图片无法展示
|


操作流程


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

网络异常,图片无法展示
|


动图演示


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

网络异常,图片无法展示
|

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


算法实现


方法1:

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

arr= [6,5,2,9,8] 
print('待排序数组:',arr)


length=len(arr)
foriinrange(length):
print("第{i}轮排序".format(i=i+1))
forjinrange(length):
ifarr[j] >arr[i]:
arr[i], arr[j] =arr[j], arr[i]
print(arr)
print("完成排序的数组:", arr)


执行结果:

网络异常,图片无法展示
|


方法2:减少的交换操作


defselectSort(arr):
foriinrange(len(arr) -1):
minIndex=iforjinrange(i+1, len(arr)):
ifarr[j] <arr[minIndex]:
minIndex=j#当i不是最小元素时,将i和最小的元素进行交换ifi!=minIndex:
arr[i], arr[minIndex] =arr[minIndex], arr[i]
#记录排序步骤print("第{i}轮排序".format(i=i+1))
print(arr)
returnarrarr1= [6,5,2,9,8]
print("完成排序的数组:",selectSort(arr1))


执行结果:

网络异常,图片无法展示
|


总结


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

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
63 4
|
2月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
2月前
|
机器学习/深度学习 人工智能 Rust
MindSpore QuickStart——LSTM算法实践学习
MindSpore QuickStart——LSTM算法实践学习
42 2
|
2月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
21 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
2月前
|
搜索推荐 Java Go
深入了解选择排序算法
深入了解选择排序算法
25 4
|
2月前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
31 0
|
2月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
4月前
|
DataWorks 算法 调度
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
44 1