简单选择排序

目录

  • 基本原理
  • 举例
  • 示例代码
  • 总结
    • 简单选择排序 VS 堆排序
    • 简单选择排序 VS 冒泡排序

本文主要介绍简单选择排序的基本原理、具体例子,以及代码实现。

基本原理

简单选择排序的基本原理是:

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。
    选择排序的主要优点与其简洁性有关,在实际应用中,适合于元素个数较少的情况。
    选择排序的时间复杂度为O(n^2),其中n为数组的长度。

举例

假设我们有一个数组 [5, 8, 6, 3, 9, 2, 1, 7],我们要对其进行升序排序,使用简单选择排序的过程如下:

  1. 首先在未排序序列中找到最小的元素1,将其与序列的第一个元素5交换,得到 [1, 8, 6, 3, 9, 2, 5, 7]。
  2. 然后在剩下的未排序元素中找到最小的元素2,将其与第二个元素8交换,得到 [1, 2, 6, 3, 9, 8, 5, 7]。
  3. 继续这个过程,我们可以得到 [1, 2, 3, 6, 9, 8, 5, 7] -> [1, 2, 3, 5, 9, 8, 6, 7] -> [1, 2, 3, 5, 6, 9, 8, 7] -> [1, 2, 3, 5, 6, 7, 9, 8] -> [1, 2, 3, 5, 6, 7, 8, 9]。
  4. 最后,我们得到了完全排序的数组 [1, 2, 3, 5, 6, 7, 8, 9]。
    这就是简单选择排序的基本过程。

示例代码

以下是简单选择排序的C语言实现:

#include <stdio.h>void selectSort(int arr[], int n) {int i, j, minIndex, temp;for (i = 0; i < n - 1; i++) {minIndex = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}if (minIndex != i) {temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}
}int main() {int arr[] = {5, 8, 6, 3, 9, 2, 1, 7};int n = sizeof(arr) / sizeof(arr[0]);selectSort(arr, n);for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}

在这段代码中,我们首先定义了一个selectSort函数,该函数接受一个整数数组和数组的长度作为参数。在函数中,我们使用两个嵌套的for循环来遍历数组,找到最小的元素,并将其放到正确的位置。然后在main函数中,我们创建了一个数组,并调用selectSort函数对其进行排序,最后打印出排序后的数组。

总结

简单选择排序 VS 堆排序

简单选择排序和堆排序都是选择排序的一种,它们的共同点是都在每一次迭代中找出剩余元素中的最大或最小值。
不同之处在于:

  1. 简单选择排序:每次迭代时,都要遍历剩余的所有元素来找出最大或最小值,时间复杂度为O(n^2)。
  2. 堆排序:通过构建堆这种数据结构,可以在O(logn)的时间复杂度内找出最大或最小值,然后将其移动到序列的一端,这样整体的时间复杂度就降低到了O(nlogn)。
    所以,可以说堆排序是对简单选择排序的一种改进,它降低了时间复杂度,提高了效率。

简单选择排序 VS 冒泡排序

冒泡排序和简单选择排序都是基本的排序算法,它们的主要区别在于排序过程和效率:

  1. 冒泡排序:它的工作原理是通过重复地遍历待排序的序列,比较每对相邻的元素并交换位置(如果需要),直到整个序列有序。冒泡排序的时间复杂度为O(n^2)。
  2. 简单选择排序:它的工作原理是在每一次迭代中找出未排序元素中的最小(或最大)元素,然后将其放到已排序序列的末尾,直到所有元素都排序完毕。简单选择排序的时间复杂度也为O(n^2)。

主要区别:

  • 冒泡排序是通过每次遍历序列比较并交换相邻元素的位置来实现排序,而简单选择排序则是通过每次找出未排序元素中的最小(或最大)元素来实现排序。
  • 在交换次数上,冒泡排序的数据移动次数通常比简单选择排序要多;冒泡排序是每次比较都可能会交换,而简单选择排序是每轮循环结束后才进行一次交换。
  • 在效率上,当待排序序列基本有序时,冒泡排序的效率较高,因为它可以在实际排序过程中提前结束。而简单选择排序无论序列初始状态如何,都会进行n-1次选择操作,因此不具备提前结束的特性。

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

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

相关文章

一个奇怪的蓝牙模块分析记录

蓝牙标识PZ-BT11 从这个蓝牙通电后的表现可以看到有2个蓝牙&#xff0c;其中一个带有BLE标识&#xff0c;可能是一个双模蓝牙 首先这不是一个普通的JDY蓝牙&#xff0c; 因为普通JDY蓝牙只有1个蓝牙信号&#xff08;从手机搜索蓝牙&#xff09; 这可能是一个BLE蓝牙 因为B…

VMware——WindowServer2012R2环境mysql5.7.14解压版安装主从复制(图解版)

目录 一、服务器信息二、192.168.132.33主服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 …

Vue3 源码解读系列(七)——侦听器

侦听器 watch 侦听器是当侦听的对象或者函数发生了变化则自动执行某个回调函数。 侦听器的内部设计&#xff1a;侦听响应式数据的变化&#xff0c;内部创建 effect runner&#xff0c;首次执行 runner 做依赖收集&#xff0c;然后在数据发生变化后&#xff0c;以某种调度方式…

ESP32C3小飞控调试

ESP32C3小飞控调试 - 1 ESP32C3小飞控板赶在国庆节前发出打样&#xff0c;假期后上班就收到了样板&#xff0c;但是迟迟没有动手调试&#xff0c;这两天终于抽出时间调试了&#xff0c;调试过程还算顺利&#xff0c;基本没有遇到什么大问题&#xff0c;下面记录一下调试过程。…

什么是轻量应用服务器?腾讯云轻量服务器可以干什么?

腾讯云轻量应用服务器&#xff08;TencentCloud Lighthouse&#xff09;是新一代开箱即用、面向轻量应用场景的云服务器产品&#xff0c;轻量应用服务器可用于搭建中小型网站、Web应用、博客、论坛、小程序/小游戏、电商、云盘/图床、云端开发测试和学习环境等轻量级、中低负载…

微信可以注册小号啦,看看怎么操作

微信支持同一手机号绑定两个账号啦&#xff01; 生活号和工作号可以分开啦&#xff5e;实用又简单&#xff01; 详细步骤如下&#xff1a; ①点击微信-我的-设置 ②点击“切换账号” ③点击“添加账号” ④点击“注册新账号” ⑤点击“通过当前微信的手机号辅助注册” ⑥安…

《 机器人基础 》期末试卷(A)

一、填空题&#xff08;30分&#xff0c;每空2分&#xff09; 1. 按照相机的工作方式&#xff0c;机器人常用相机分为1&#xff09;__ 单目摄像头 2&#xff09;__ 双目摄像头 _ 3&#xff09;_深度摄像头_ 三类。 2. 度量地图强调…

建议收藏《Verilog代码规范笔记_华为》

华为verilog编程规范是坊间流传出来华为内部的资料&#xff0c;其贴合实际工作需要&#xff0c;是非常宝贵的资料&#xff0c;希望大家善存。至于其介绍&#xff0c;在此不再赘述&#xff0c;大家可看下图详细了解&#xff0c;感兴趣的可私信移知教育老师领取《Verilog代码规范…

超长圆钢在线直线度检测 告别手工测量时代

圆钢的直线度指的是它的表面形状是否呈现出直线。直线度是圆钢的重要品质要求之一&#xff0c;与其物理性能密切相关。在工业制造中&#xff0c;如果圆钢的直线度不达标&#xff0c;就会影响其后续的加工和使用效果&#xff0c;严重时甚至会造成损失。 超长圆钢的检测&#xff…

4-4有人写了一个函数

#include<stdio.h> int main(){int x,y;for(int i0;i<3;i){printf("输入x:");scanf("%d",&x);if(x<0){y(-1);printf("x%d的结果是y%d\n",x,y);}else if(x>0){y1;printf("x%d的结果是y%d\n",x,y);}else{y0;printf(&…

/main/binary-i386/Packages 404 File not found

在Ubuntu中使用本地源安装软件时提示以下错误&#xff1a; ......正在读取软件包列表... 完成 E: 无法下载 http://192.168.1.1:8000/dists/Jammy/main/binary-i386/Packages 404 File not found [IP: 192.168.1.1 8000] E: 无法下载 http://192.168.1.1:8000/dists/Jammy-upd…

多表查询内连接、外连接、子查询、笛卡尔积

1.1 多表查询&#xff1a;从多张表中进行查询 仅仅使用select * from tb_emp,tb_dept查询语句会显示如下结果&#xff08;笛卡尔积&#xff1a;两个表的所有的组合情况&#xff09;其中很大部分数据是冗余的。 1.2内连接&#xff1a;相当于查询A,B表交集部分的数据&#xff08…

作为电子信息工程的学生,学完stm32后,是应该学fpga还是Linux?

作为电子信息工程的学生&#xff0c;学完stm32后&#xff0c;是应该学fpga还是Linux? 我自己也是电子信息工程专业出身&#xff0c;FPGA和Linux都是我们大三的专业课&#xff0c;都学过基础也做了基础 的项目&#xff0c;我自己的选择是Linux。最近很多小伙伴找我&#xff0c…

预包装食品备案与食品经营许可证两者的关系

在食品行业中&#xff0c;预包装食品备案和食品经营许可证是两个重要的概念。它们之间存在一定的关系&#xff0c;但又不完全相同。本文将详细介绍两者的定义、区别和联系。 一、预包装食品备案 预包装食品备案&#xff0c;是指对预包装食品的生产者或进口商进行备案登记的一种…

css制作瀑布流布局

CSS制作瀑布流布局的步骤如下&#xff1a; HTML结构&#xff1a;使用无序列表ul和列表项li来创建网格布局。 <ul class"grid"><li><img src"image1.jpg"></li><li><img src"image2.jpg"></li><l…

【kafka】使用docker启动kafka

1.环境准备 docker拉取zookeeper镜像 docker pull zookeeper:3.4.14 创建zookeeper容器&#xff0c;默认端口号为2181 docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14 拉取kafka镜像 docker pull wurstmeister/kafka:2.12-2.3.1 创键kafka容器&#xff…

OpenCV [c++](图像处理基础示例小程序汇总)

OpenCV [c++](图像处理基础示例小程序汇总) 推荐 原创 NCUTer 2023-04-04 14:18:49 文章标签 Image 图像处理 文章分类 计算机视觉 人工智能 在51CTO的第一篇博文 阅读数1467 一、图像读取与显示 #include<opencv2/opencv.hpp> #include<iostream>using…

git修改commit历史提交时间、作者

1、修改最近的几条记录&#xff0c;进入提交记录列表&#xff0c;修改提交记录模式 git rebase -i HEAD~3 // 修改最近的三条记录&#xff0c;顺序排列按提交时间升序 指令说明&#xff1a; pick&#xff1a;保留该commit&#xff08;缩写:p&#xff09; reword&#xff1a…

迎接“全全闪”时代 星辰天合发布星海架构和星飞产品

11 月 17 日&#xff0c;北京市星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY星辰天合&#xff09;在北京首钢园举办了主题为“星星之火”的 XSKY 星海全闪架构暨星飞存储发布会&#xff0c;到场嘉宾共同见证了全新的分布式全闪架构“星海&#xff08;XSEA&#x…