【C语言】深入解析选择排序

文章目录

        • 什么是选择排序?
        • 选择排序的基本实现
        • 代码解释
        • 选择排序的优化
        • 选择排序的性能分析
        • 选择排序的实际应用
        • 结论

在这里插入图片描述

在C语言编程中,选择排序是一种简单且直观的排序算法。尽管它在处理大型数据集时效率不高,但由于其实现简单,常常用于教学和简单应用中。本文将详细介绍选择排序算法,包括其定义、实现、优化方法和性能分析,帮助读者深入理解这一经典算法。

什么是选择排序?

选择排序(Selection Sort)是一种基于比较的排序算法。其基本思想是每次从未排序部分中选出最小(或最大)的元素,将其放在已排序部分的末尾。重复这一过程,直到所有元素都排序完成。

选择排序的基本实现

以下是选择排序的基本实现代码:

#include <stdio.h>// 交换两个元素的值
void swap(int* a, int* b) {int t = *a;*a = *b;*b = t;
}// 选择排序函数
void selectionSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {// 找到未排序部分的最小元素int min_idx = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[min_idx])min_idx = j;}// 交换最小元素和未排序部分的第一个元素swap(&arr[min_idx], &arr[i]);}
}// 打印数组函数
void printArray(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}// 主函数
int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr)/sizeof(arr[0]);printf("未排序的数组: \n");printArray(arr, n);selectionSort(arr, n);printf("排序后的数组: \n");printArray(arr, n);return 0;
}
代码解释
  1. 交换函数swap

    • 用于交换两个元素的值。
  2. 选择排序函数selectionSort

    • 使用一个for循环遍历数组,每次选出未排序部分的最小元素,并将其与未排序部分的第一个元素交换。
    • 内层循环用于找到未排序部分的最小元素索引min_idx
  3. 打印数组函数printArray

    • 遍历数组并打印每个元素,便于查看排序结果。
  4. 主函数main

    • 初始化一个整数数组并计算其大小。
    • 调用selectionSort函数对数组进行排序。
    • 打印排序前后的数组。
选择排序的优化

选择排序的基本实现已经非常简单直接,但仍有一些优化方法可以稍微提升其性能:

  1. 减少交换操作

    • 在内层循环中仅记录最小元素的索引,外层循环结束后再进行交换操作,这样可以减少不必要的交换操作。

    优化代码示例:

    void selectionSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {int min_idx = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[min_idx])min_idx = j;}// 仅在需要时才进行交换if (min_idx != i)swap(&arr[min_idx], &arr[i]);}
    }
    
  2. 双向选择排序

    • 双向选择排序在每一轮中同时选出最小值和最大值,并分别放置在未排序部分的两端,从而减少排序轮数。

    优化代码示例:

    void selectionSort(int arr[], int n) {for (int i = 0; i < n/2; i++) {int min_idx = i;int max_idx = i;for (int j = i+1; j < n-i; j++) {if (arr[j] < arr[min_idx])min_idx = j;if (arr[j] > arr[max_idx])max_idx = j;}// 交换最小值到未排序部分的起始位置if (min_idx != i)swap(&arr[min_idx], &arr[i]);// 如果最大值是起始位置的元素,需要更新max_idxif (max_idx == i)max_idx = min_idx;// 交换最大值到未排序部分的末尾位置if (max_idx != n-i-1)swap(&arr[max_idx], &arr[n-i-1]);}
    }
    
选择排序的性能分析

选择排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2),这是因为每次选出最小(或最大)元素都需要遍历未排序部分。无论最坏、最好还是平均情况,选择排序的时间复杂度都是 O ( n 2 ) O(n^2) O(n2)。虽然选择排序的时间复杂度较高,但由于其简单性,在处理小型数据集时仍有一定的应用价值。

选择排序的空间复杂度为 O ( 1 ) O(1) O(1),因为它只需要常数级别的额外空间来存储临时变量。选择排序是一个不稳定的排序算法,因为相同元素的相对位置可能会改变。

选择排序的实际应用

选择排序由于其简单性和易实现性,在以下几种情况下非常有用:

  1. 教学和演示

    • 选择排序算法简单直观,非常适合作为初学者学习排序算法的入门教材。
  2. 小型数据集

    • 在处理小型数据集时,选择排序的性能足够,而且实现简单。
  3. 需要简单实现的场景

    • 选择排序的实现代码简洁明了,适合在需要快速实现排序功能的场景中使用。
结论

选择排序是C语言中一种简单且直观的排序算法,其实现简单且易于理解。尽管选择排序的效率较低,但通过减少不必要的交换操作和双向选择排序等方法,可以在一定程度上提升其性能。在学习和使用选择排序时,了解其优缺点以及适用场景,能够帮助我们更好地选择和使用排序算法。希望本文能帮助读者深入理解选择排序,并在实际编程中灵活应用。

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

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

相关文章

牛客TOP101:反转链表

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 简单粗暴的写法&#xff0c;就是从头到尾挨个将所有结点的指向翻转即可。需要注意的是&#xff0c;翻转之后会失去原有指向的结点&#xff0c;所以需要提前保存。   具体做法就是&#xff0c;使用cur标记…

硬件检测工具 | CPU-Z v2.10.0 官方中文绿色版

软件简介 CPU-Z是一款广受欢迎的硬件检测工具&#xff0c;主要用于收集电脑处理器的详细信息。这款软件能够提供关于CPU的详细数据&#xff0c;包括处理器名称、编号、代号、进程和缓存等信息。此外&#xff0c;CPU-Z还能实时监测每个内核的内部频率和内存频率&#xff0c;以及…

如何在项目中打印sql和执行的时间

目标&#xff1a;打印DAO方法中sql和执行的时间 一种方式是去实现Mybatis的拦截器Interceptor &#xff0c;比较麻烦&#xff1b; 这里介绍一种比较简单的实现方式&#xff1b; 1、如何打印sql&#xff1f; 配置文件加这个可以打印出com.zhenhui.ids.busi.watch包下执行的sq…

c++包管理器

conan conan search&#xff0c;查看网络库 conan profile detect&#xff0c;生成缓存信息conan new cmake_exe/cmake_lib&#xff0c;创建cmakelists.txtconan install .&#xff0c;执行Conanfile.txt中的配置&#xff0c;生成相关的bat文件 项目中配置Conanfile.txt(或者…

tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

零基础STM32单片机编程入门(十四) DS18B20温度传感器模块实战含源码

文章目录 一.概要二.DS18B20主要性能参数三.DS18B20温度传感器内部框图四.DS18B20模块原理图五.DS18B20模块跟单片机板子接线和通讯时序1.单片机跟DS18B20连接示意图2.单片机跟DS18B20通讯流程与时序3.通讯流程中的9个数据字节内容格式4.温度数据寄存器LSB/MSB格式 六.STM32单片…

【HarmonyOS】鸿蒙中如何获取用户相册图片?photoAccessHelper.PhotoViewPicker

【HarmonyOS】鸿蒙中如何获取用户相册图片&#xff1f;photoAccessHelper.PhotoViewPicker 前言 有同学私聊我说&#xff0c;之前的博客文章提到的没有HarmonyOS白名单帐号&#xff0c;如何在OpenHarmony Gitee开发仓里学习API接口。需要注意一个点&#xff0c;默认看到的文档…

图、图的遍历、最小生成树、最短路径

0、图的概念 **图:**是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 顶点集合V {x|x属于某个数据对象集}是有穷非空集合&#xff1b;边的集合E {(x,y)|x,y属于V}或者E {|x,y属于V && Path(x, y)}是顶…

浅学三次握手

数据要完成传输&#xff0c;必须要建立连接。由于建立TCP连接的过程需要来回3次&#xff0c;所以&#xff0c;将这个过程形象的叫做三次握手。 结合上面的图来看更清楚。 先说三次握手吧&#xff0c;连接是后续数据传输的基础。就像我们打电话一样&#xff0c;必须保证我和对方…

在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位一、数据实时监控的重要性二、PostgreSQ…

shell,重定向与管道符号

文章目录 一&#xff0c;什么是shell二&#xff0c;shell脚本和作用1. shell脚本2. 作用 三&#xff0c;shell脚本的构成内容四&#xff0c;创建和运行Shell脚本五&#xff0c;重定向与管道操作1. 交互式硬件设备2. 重定向操作概览表3. 管道操作 一&#xff0c;什么是shell sh…

Matlab 判断直线上一点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 判断一个点是否位于一直线上有很多方法,这里使用一种很有趣的坐标:Plucker线坐标,它的定义如下所示: 这个坐标有个很有趣的性质,我们可以使用Plucker坐标矢量构建一个Plucker矩阵: 则它与位于对应线上的齐次点…

排序(三)——归并排序(MergeSort)

欢迎来到繁星的CSDN&#xff0c;本期内容主要包括归并排序(MergeSort)的实现 一、归并排序的主要思路 归并排序和上一期讲的快速排序很像&#xff0c;都利用了分治的思想&#xff0c;将一整个数组拆成一个个小数组&#xff0c;排序完毕后进行再排序&#xff0c;直到整个数组排序…

文章管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;作者管理&#xff0c;文章管理&#xff0c;文章分类管理&#xff0c;论坛&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;文章&#xff0c;论坛&#xff0c;我的 开发系统…

代码随想录算法训练营第五十四天|99.岛屿数量 深搜、广搜、100.岛屿的最大面积

99.岛屿数量 题目链接&#xff1a;99.岛屿数量 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 深搜 思路&#xff1a; 遍历网格&#xff0c;发现岛屿&#xff1a;我们需要遍历整个二维网格&#xff0c;检查每一个位置上的元素。如果在遍历过程中遇到陆地&#xff08;…

计网(1.1~1.4)

1.1计算机网络在信息时代的作用 21世纪的重要特征数字化、网络化和信息化 有三类网络&#xff1a;电信网络、有线电视网络和计算机网络 互联网两个重要基本特点&#xff0c;即连通性和共享 1.2因特网概述 &#xff08;1&#xff09;网络、互联网和互连网 网络:由若干结点和连接…

企业全历史行为数据 让你对竞争对手的一切清清楚楚

关于商业竞争&#xff0c;在刚进入信息时代的那些年&#xff0c;人们说“现代商战就是信息战”&#xff0c;强调用非对称的或者更快获得的信息来赢得竞争&#xff1b;近些年进入大数据时代&#xff0c;人们又说“得数据者得天下”&#xff0c;发现“数据算法”有很多妙用&#…

2024 Q1:AVP时代下全球XR头显市场动态与展望

随着苹果Vision Pro&#xff08;AVP&#xff09;的发布&#xff0c;空间计算时代正式拉开序幕&#xff0c;全球扩展现实&#xff08;XR&#xff09;产业迎来新的发展机遇与挑战。尽管苹果的加入激发了市场活力&#xff0c;但2024年第一季度的XR头显市场却呈现出复杂多变的格局&…

压缩视频的最佳方法,视频压縮大小不影响画质

在数字媒体时代&#xff0c;视频已成为我们记录生活和传递信息的重要方式。但随着视频分辨率的提升和拍摄时长的增加&#xff0c;视频文件的大小也随之“膨胀”。大视频文件不仅占用大量存储空间&#xff0c;还在分享和传输过程中造成不便。如何在保证画质的前提下&#xff0c;…

《基于 LatentFactor + Redis + ES 实现动态药房分配方法》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;欢迎多多交流。&am…