算法之选择排序

算法之选择排序

简单选择排序

  • 选择排序
    • 每一趟两两比较大小,找出极值(极大值或极小值)并放置到有序区的位置。

核心算法

  • 结果可为升序或降序排列,默认升序排列。以降序为例
  • 扩大有序区,减小无序区。图中红色部分就是增大的有序区,反之就是减小的无序区
  • 相邻元素依次两两比较,获得每一次比较后的最大值,并记住此值的索引
  • 每一趟都从无序区中选择出最大值,然后交换到当前无序区最左端

nums = [1, 9, 8, 5]
print(nums)
length = len(nums)for i in range(length - 1): 	# i = 0maxindex = i 				# i = 0 假定最大数索引就是当前索引 i=0for j in range(i+1, length): # 取值范围就是索引 1,2,3 后不包没有,没有0是这些值和索引0进行比较。if nums[j] > nums[maxindex]:maxindex = j 		# 将最大索引赋值给maxindexnums[i], nums[maxindex] = nums[maxindex], nums[i] # 将索引交换,最大数放到最前方print(nums, i, maxindex)if i == 0: break			# 循环终止条件,交换一次终止。
执行结果:[1, 9, 8, 5] # 代码第2行打印的nums的值
执行结果:[9, 1, 8, 5] 0 1  # break 终止的第一次交换
nums = [1, 9, 8, 5]
print(nums)
length = len(nums)for i in range(length - 1): 	# i = 0maxindex = i 				# i = 0 假定最大数索引就是当前索引 i=0for j in range(i+1, length): # 取值范围就是索引 1,2,3 后不包没有,没有0是这些值和索引0进行比较。if nums[j] > nums[maxindex]:maxindex = j 		# 将最大索引赋值给maxindexnums[i], nums[maxindex] = nums[maxindex], nums[i] # 将索引交换,最大数放到最前方print(nums, i, maxindex)
执行结果:[1, 9, 8, 5] # 代码第2行打印的nums的值
执行结果:[9, 1, 8, 5] 0 1
执行结果:[9, 8, 1, 5] 1 2
执行结果:9, 8, 5, 1] 2 3

上面代码中我们就实现了选择排序


选择排序优化

# 变种:选择排序# 一次确定最大数与最小数num_list = [[1, 9, 8, 5], [9, 1, 8, 5]] 	# 列表套列表
nums = num_list[1] 							# 选择排序的列表,也就是索引1的列表
print(nums)
length = len(nums)count_iter = 0 			# 比较次数
count_swap = 0 			# 交换次数for i in range(length // 2):	 # 2个数找1次,3个数找1次,4个数找2次,5个数找2次,这就是为什么整除2maxindex = i				 # i = 0 假定最大数索引就是当前索引 i=0minindex = -i-1 			 # min = -1# j循环作用记住极大值的索引和极小值的索引for j in range(i+1, length): 	# 取值范围就是索引 1,2,3 后不包没有,没有0是这些值和索引0进行比较。count_iter += 1 			# 比较次数if nums[j] > nums[maxindex]:maxindex = j 			# 将最大索引赋值给maxindexif nums[minindex] > nums[-j-1]:minindex = -j-1 		# 负索引 -1就是最后一个索引print(maxindex, minindex, '+++')if i != maxindex: 				# 进行条件判断,索引0小于1-2-3才进行交换nums[i], nums[maxindex] = nums[maxindex], nums[i] # 将索引交换,最大数放到最前方count_swap += 1 			# 交换次数break 							# 执行一次就终止
执行结果:[9, 1, 8, 5]
执行结果:0 -3 +++
num_list = [[1, 9, 8, 5], [9, 1, 8, 5]] 	# 列表套列表
nums = num_list[1] 							# 选择排序的列表,也就是索引1的列表
print(nums)
length = len(nums)count_iter = 0 			# 比较次数
count_swap = 0 			# 交换次数for i in range(length // 2): 	# 2个数找1次,3个数找1次,4个数找2次,5个数找2次,这就是为什么整除2maxindex = i 				# i = 0 假定最大数索引就是当前索引 i=0minindex = -i-1 			# min = -1minorigin = minindex 		# 减少计算量# j循环作用记住极大值的索引和极小值的索引for j in range(i+1, length): 	# 取值范围就是索引 1,2,3 后不包没有,没有0是这些值和索引0进行比较。count_iter += 1 			# 比较次数if nums[j] > nums[maxindex]:maxindex = j 			# 将最大索引赋值给maxindexif nums[minindex] > nums[-j-1]:minindex = -j-1 		# 负索引 -1就是最后一个索引print(maxindex, minindex, '+++')if i != maxindex: 				# 进行条件判断,索引0小于1-2-3才进行交换nums[i], nums[maxindex] = nums[maxindex], nums[i] # 将索引交换,最大数放到最前方count_swap += 1 			# 交换次数if minorigin != minindex:nums[minorigin], nums[minindex] = nums[minindex], nums[minorigin]count_swap += 1print(nums, i, maxindex)print('_' * 30)
print(nums, count_iter, count_swap)
执行结果:
[9, 1, 8, 5]
0 -3 +++
[9, 5, 8, 1] 0 0
2 -3 +++
[9, 5, 8, 1] 1 2
______________________________
[9, 5, 8, 1] 5 3  

最后得到的结果并不是按序排的

num_list = [[1, 9, 8, 5], [9, 1, 8, 5]]	 	# 列表套列表
nums = num_list[1] 							# 选择排序的列表,也就是索引1的列表
print(nums)
length = len(nums)count_iter = 0			 # 比较次数
count_swap = 0 			 # 交换次数for i in range(length // 2): 	# 2个数找1次,3个数找1次,4个数找2次,5个数找2次,这就是为什么整除2maxindex = i 				# i = 0 假定最大数索引就是当前索引 i=0minindex = -i-1 			# min = -1minorigin = minindex 		# 减少计算量# j循环作用记住极大值的索引和极小值的索引for j in range(i+1, length): 	# 取值范围就是索引 1,2,3 后不包没有,没有0是这些值和索引0进行比较。count_iter += 1 			# 比较次数if nums[j] > nums[maxindex]:maxindex = j			# 将最大索引赋值给maxindexif nums[minindex] > nums[-j-1]:minindex = -j-1 		# 负索引 -1就是最后一个索引print(maxindex, minindex, '+++')if i != maxindex: 				# 进行条件判断,索引0小于1-2-3才进行交换nums[i], nums[maxindex] = nums[maxindex], nums[i] # 将索引交换,最大数放到最前方count_swap += 1 			# 交换次数# 重要的事说3遍# 克服交换对最小值所以的干扰# 克服交换对最小值所以的干扰# 克服交换对最小值所以的干扰if i == minindex or i == length + minindex: # 条件 i是最小值 或 i 是长度+最小值minindex = maxindex - length  			# 最小值就等于 最大值减长度if minorigin != minindex:nums[minorigin], nums[minindex] = nums[minindex], nums[minorigin]count_swap += 1print(nums, i, maxindex)print('_' * 30)
print(nums, count_iter, count_swap)
执行结果:
[9, 1, 8, 5]
0 -3 +++
[9, 5, 8, 1] 0 0
2 -3 +++
[9, 8, 5, 1] 1 2
______________________________
[9, 8, 5, 1] 5 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法之美学习笔记:27 | 递归树:如何借助树来求解递归算法的时间复杂度?

目录 前言递归树与时间复杂度分析实战一:分析快速排序的时间复杂度实战二:分析斐波那契数列的时间复杂度实战三:分析全排列的时间复杂度内容小结 前言 本节课程思维导图: 今天,我们来讲这种数据结构的一种特殊应用&am…

YOLO改进系列之SKNet注意力机制

摘要 视皮层神经元的感受野大小受刺激的调节即对于不同的刺激,卷积核的大小应该不同,但在构建CNN时一般在同一层只采用一种卷积核,很少考虑因采用不同卷积核。于是SKNet被提出,在SKNet中,不同大小的感受视野&#xff…

Java异常详解

Java 异常详解 Execption 和 Error 有什么区别? execption 是程序可自行处理的异常,可以通过 catch 进行捕获,可分为两类: Checked Exception (受检查异常,必须处理)和 Unchecked Exception &…

深度学习框架配置

目录 1. 配置cuda环境 1.1. 安装cuda和cudnn 1.1.1. 显卡驱动配置 1.1.2. 下载安装cuda 1.1.3. 下载cudnn,将解压后文件复制到cuda目录下 1.2. 验证是否安装成功 2. 配置conda环境 2.1. 安装anaconda 2.2. conda换源 2.3. 创建conda环境 2.4. pip换源 3.…

【工作记录】spider-flow使用插件连接并操作mongodb数据库

前言 前面说过,spider-flow有着非常优秀的插件机制,可以通过插件实现功能的扩展。前面有小伙伴问到mongodb的集成使用,本文就来梳理下spider-flow中使用mongodb插件的过程,其实非常简单。 PS: spider-flow的作者已经实现了一些常…

飞翔的小鸟小游戏

主类 package APP;import 框架.GameFrame;public class GameApp {public static void main(String[] args) {//游戏的入口new GameFrame();} }场景实物 package 框架;import 图导.Constant; import 图导.GameUtil;import java.awt.*; import java.awt.image.BufferedImage; …

C语言——数字金字塔

实现函数输出n行数字金字塔 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>void pyramid(int n) {int i,j,k;for (i1; i<n; i){//输出左边空格&#xff0c;空格数为n-i for (j1; j<n-i; j){printf(" "); } //每一行左边空格输完后输出数字&#…

STM32g70开启定时器死机原因

在做低功耗产品时&#xff0c;检查发现由于之前开启了BOOTLOADER升级程序&#xff0c;修改了中断向量FALSH起始地址&#xff0c;只在KEIL TARGET IROM1中修改了&#xff0c; 而忘记在程序文件system_stm32f10x.c里修改中断向量表flash起始地址 system_stm32f10x.c里&#xff0…

8款前端特效动画及源码分享

3D立体数字时钟滚动特效 基于Splitting制作的一款3D立体数字时钟滚动特效&#xff0c;创意感满满&#xff0c;可以下载使用。 预览获取 核心代码 <div class"clock"><span class"cog hours tens" data-splitting>0123456789</span>&l…

智能优化算法应用:基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸡群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

EZDML基本介绍

一、表结构设计器(EZDML) 这是一个数据库建表的小软件&#xff0c;可快速的进行数据库表结构设计&#xff0c;建立数据模型。类似大家常用的数据库建模工具如PowerDesigner、ERWIN、ER-Studio和Rational-Rose等的超级精简版。 官方下载地址&#xff1a;http://www.ezdml.com/d…

一文教你uni-app开发小程序直播功能,轻松打造专属直播间!

1、微信后台申请插件开通 微信后台 登录微信后台 点击设置中的第三方设置 —> 添加插件 --> 点击小程序直播组件&#xff08;获取AppID&#xff09; 2、微信后台开通直播功能 点击进入直播后台系统 这里就是我们创建的直播功能区域 3、代码中接入直播插件AppID 支持在…

Django实现websocket完成实时通讯,聊天室,在线客服等

websocket协议分析 一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。 在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xf…

思维导图软件MindNode 5 mac使用场景

MindNode 5 for Mac是一款思维导图软件产品&#xff0c;为用户在灵感启发、思绪整理、记忆协助、项目规划、授课讲演等诸多场景下提升学习和工作效率。通过导图社区和云文件无缝链接用户设备&#xff0c;方便用户随时随地收集灵感和展示文档。 MindNode 5 for Mac应用场景 助力…

python 继承父类的变量和方法

[root@zz python]# cat a1.py # !/usr/bin/env python # -*- coding: utf-8 -*- class AddrBookEntry(object): ##类定义 def __init__(self,a,b): ##定义构造器 self.var1=a+9 self.var2=b+11 def updatePhone(self, num): # 定义方法 sel…

【axios】TypeScript实战,结合源码,从0到1教你封装一个axios - 基础封装篇

目录 前言版本环境变量配置引入的类型1、AxiosIntance: axios实例类型2、InternalAxiosRequestConfig: 高版本下AxiosRequestConfig的拓展类型3、AxiosRequestConfig: 请求体配置参数类型4、AxiosError: 错误对象类型5、AxiosResponse: 完整原始响应体类型 目标效果开始封装骨架…

【古月居《ros入门21讲》学习笔记】15_ROS中的坐标系管理系统

目录 说明&#xff1a; 1. 机器人中的坐标变换 tf功能包能干什么&#xff1f; tf坐标变换如何实现 2. 小海龟跟随实验 安装 ros-melodic-turtle-tf 实验命令 运行效果 说明&#xff1a; 1. 本系列学习笔记基于B站&#xff1a;古月居《ROS入门21讲》课程&#xff0c;且使…

KT1404C语音芯片做的板子连接usb到电脑出来空的盘符 怎么处理?

一、问题简介 KT1404C画的板子&#xff0c;连接usb到电脑&#xff0c;出来空的盘符&#xff0c;可以确定KT404C没问题放别的板子OK&#xff0c;就是这个板子不正常&#xff0c;并且芯片5脚的电压输出是3.5v &#xff0c;正常的板子是3.3v&#xff0c;什么问题呢&#xff1f; 问…

数据结构之二叉树与堆以及力扣刷题函数扩展

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力 目录 1.前言 2.树 2.1概念 2.2树的相关概念 3.…

Python自动化办公:PDF文件的加密与解密

在本篇文章中&#xff0c;我们将介绍如何使用PyPDF2库对PDF文件进行加密和解密操作。 包括如何给PDF文件添加密码&#xff0c;以及如何从受密码保护的PDF文件中删除密码。 注&#xff1a;删除密码的操作&#xff0c;前提是需要知道密码哦 1. 安装PyPDF2库 首先&#xff0c;…