一、选择排序(selection sort)

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,所以称为:选择排序。

二、选择排序原理

  1. 设第一个元素为比较元素,依次和后面的元素比较,比较完所有元素并找到最小元素,记录最小元素下标,和第0个下表元素进行交换。
  2. 在未排序区域中,重复上述操作,以此类推找出剩余最小元素将它换到前面,即完成排序。

三、选择排序和冒泡排序对比

选择排序是一种简单直观的排序算法。它与冒泡排序很相似,都是比较 n-1 轮,每轮都是比较 n–1–i 次,每轮找出一个最大值或最小值。

只不过,冒泡排序是将每轮找出的最值放到最右边,而选择排序是将每轮找出的最值放到最左边。并且在算法上,冒泡排序是将相邻的数进行逐个比较,以从小到大排序为例,只要前面的比后面的大,就互换这两个数,直到最后将最大的数“浮”到最右边,如此依次循环。而选择排序是先保存第一个元素的下标,然后后面所有的数依次与第一个元素相比,如果遇到更小的,则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后将最小的数的下标找出来,然后再将这个数放到最左边,即与下标为 0 的数互换。如果最小的数的下标就是 0 那么就不用互换。

所以,选择排序算法是先判断最小的数的下标是不是 0,如果不是则说明最小的数不是第一个元素,则将这个数与第一个元素互换位置,这样一轮下来最小的那个数就被找到并放到了最左边。

在第二轮同样先保存新序列第二个元素的下标,后面所有的数依次与第二个元素相比较,如果遇到更小的则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后又找到一个最小的,此时这个最小的在整个序列中是“第二小”。然后再判断这个数的下标是否等于 1,如果不等于 1 说明“第二小”的那个数不是第二个元素,则将这个数与第二个元素互换位置,这样第二轮下来就找到了“第二小”的那个数,并将它放到了第二个位置。如此循环,直到整个序列实现从小到大排序。

如果是从大到小排序,那么就记录大的那个数的下标,每一轮找出一个最大的数放到左边。

从上面的分析可以看出,选择排序和冒泡排序的另一个不同点是,冒泡排序只要遇到前面比后面大的就互换,而选择排序是比较一轮才互换一次,而且如果本轮中最小的就是最左边那个数则不用互换。所以从这个角度看,选择排序比冒泡排序的效率要高。而且通过上面对选择排序的分析发现,从逻辑上讲,与冒泡排序相比,选择排序更符合人的思维。

四、选择排序流程图

五、选择排序的代码实现(python)

def selection_sort(num_list):length = len(num_list)if length <= 1:return num_listfor j in range(length):# 假设第一个元素为最小元素min_num_index = j# 遍历未排序区域元素,以此和未排序区域的第一个元素做对比for i in range(j+1, length):if num_list[i] < num_list[min_num_index]:min_num_index = i# 交换位置num_list[min_num_index], num_list[j] = num_list[j], num_list[min_num_index]return num_listif __name__ == '__main__':a = [1, 3, 2, 6, 4, 12, 33, 5, 25]print(selection_sort(a))

六、时间复杂度和空间复杂度

空间复杂度:只需要常数个辅助单元,所以空间复杂度为O(1)

时间复杂度:我们看到选择排序同样是双层循环n*(n-1)),所以时间复杂度也为:O(n^2)

稳定性:因为存在任意位置的两个元素交换,比如[5, 8, 5, 2],第一个5会和2交换位置,所以改变了两个5原来的相对顺序,所以为不稳定排序。

是否为原地排序: 是原地排序

python 选择排序算法相关推荐

  1. python写选择排序_如何快速掌握python选择排序算法?

    对于算法,我们不少讲述,但是大部分小伙伴都希望,将单个算法拆分讲解,这样可以更加深对算法的印象,好了,本期,就针对选择排序算法,给大家讲解说明哦~感兴趣的小伙伴一起来看下吧~ 在列表list模块中,已 ...

  2. 选择排序法python详解-Python选择排序算法(三)

    优化选择排序算法,大致思路是每次循环分别找到最大值和最小值,放到列表的头部和尾部 代码如下: #! coding:utf8 import random def select_sort(arr): fo ...

  3. python选择排序算法图解_简单选择排序算法(C语言详解版)

    该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上. 例如对无序表{56,12,80,91 ...

  4. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  5. 排序算法python实现_用Python,Java和C / C ++实现的选择排序算法

    排序算法python实现 The Selection Sort Algorithm sorts the elements of an array. In this article, we shall ...

  6. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  7. python常见排序算法解析

    python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...

  8. 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

    目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1.java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object ...

  9. 选择排序算法实现思想个人理解

    一.选择排序算法个人理解 如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1 ...

最新文章

  1. css删除线_前端删除文字贯穿线的方法有哪些
  2. 小码哥iOS学习笔记第二天: OC对象的分类
  3. 【干货】就这一篇,解决90% 新手连接虚拟机的网络问题
  4. nyoj164——卡特兰数(待填坑)
  5. 2018蓝桥杯省赛---java---B---8(日志统计)
  6. 干涉测量技术的应用_技术分享 | 石化行业测量仪表应用在线答疑
  7. .Net水晶报表的使用总结
  8. FCC 中级算法题 所有素数之和
  9. [SQL] 常用查询脚本
  10. bitnami_redmine3.3.0-1 问题及备份恢复
  11. 计算机可行性分析报告,计算机可行性分析报告范文.docx
  12. mescroll-vue下拉上拉刷新的使用
  13. linux火狐浏览器插件位置,linux6.5/centos6.5安装mozilla 火狐浏览器flash-plugins插件
  14. php-fpm的安装和启动
  15. 大学计算机考试满分多少分,自主招生考试多少分 最多降多少分
  16. 2020 知来者之可追
  17. SQLI DUMB SERIES-8
  18. 离线地图开发-含源代码(免费)
  19. 在linux中使用getch()函数
  20. 实时监控linux的日志命令

热门文章

  1. Leetcode 45. 跳跃游戏 II (每日一题 20210922)
  2. SparkSql读取外部数据源
  3. 论文笔记 A Spatial-Temporal Decomposition Based Deep Neural Network for TimeSeries Forecasting
  4. pytorch 笔记:tensorboardX
  5. 数据挖掘系列(3)--关联规则评价
  6. 时空快照模型snapshots
  7. 白话异常检测算法Isolation Forest
  8. 第4章 最基础的分类算法-k近邻算法
  9. 互联网性能与容量评估的方法论和典型案例
  10. Scalable, Distributed Systems Using Akka, Spring Boot, DDD, and Java--转