当前位置: 首页 > news >正文

【C语言-选择排序算法】实现对十个数进行排序

目录

前言

一、选择排序算法原理

二、选择排序算法实现对十个数进行排序

三、代码运行示例

四、选择排序算法的时间复杂度和空间复杂度分析

五、选择排序算法的优缺点

六、总结


前言

        在计算机科学领域,排序算法是基石般的存在,它们就像是整理杂乱数据的魔法,让无序的数据变得井井有条。而选择排序(Selection Sort),作为一种简单直观的排序算法,在学习排序的道路上是我们绕不开的经典算法之一。今天,我们一起探讨如何使用 C 语言实现选择排序算法,对十个数字进行排序,并详细剖析其中的原理与细节。

一、选择排序算法原理

        选择排序的核心思想可以用 “挑最小的放前面” 来概括。它的执行过程就像是在一群学生中,先找出最矮的学生站到队伍最前面,然后在剩下的学生中再找出最矮的,依次类推,直到整个队伍按照身高从矮到高排列整齐。

        具体到数字排序上,在一个包含 n 个元素的数组中,选择排序会在每一轮遍历中,从待排序的元素中找出最小(或最大)的元素,将其与待排序序列的起始位置元素交换位置。每完成一轮遍历,就会有一个元素被放置到它最终的正确位置上,经过 n - 1 轮遍历后,整个数组就完成了排序。

        例如,对于数组[5, 3, 8, 6, 7],第一轮遍历会找出最小的元素3,将其与数组第一个元素5交换位置,得到[3, 5, 8, 6, 7];第二轮在剩余的[5, 8, 6, 7]中找出最小的5,由于它已经在正确位置,无需交换;第三轮在[8, 6, 7]中找出最小的6,与8交换,得到[3, 5, 6, 8, 7];第四轮在[8, 7]中找出最小的7,与8交换,最终得到有序数组[3, 5, 6, 7, 8] 。

二、选择排序算法实现对十个数进行排序

        在 C 语言中,我们可以通过以下代码实现选择排序算法对十个数字进行排序:

#include <stdio.h>// 选择排序函数
void selectionSort(int arr[], int n) {int i, j, min_index, temp;for (i = 0; i < n - 1; i++) {min_index = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_index]) {min_index = j;}}// 交换找到的最小元素和当前位置元素temp = arr[min_index];arr[min_index] = arr[i];arr[i] = temp;}
}int main() {int numbers[10];printf("请输入十个整数:\n");for (int i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}selectionSort(numbers, 10);printf("排序后的结果为:\n");for (int i = 0; i < 10; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}

代码详解:

选择排序函数selectionSort

void selectionSort(int arr[], int n) {int i, j, min_index, temp;for (i = 0; i < n - 1; i++) {min_index = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_index]) {min_index = j;}}// 交换找到的最小元素和当前位置元素temp = arr[min_index];arr[min_index] = arr[i];arr[i] = temp;}
}
  • 函数参数:arr是要排序的数组,n是数组的元素个数。
  • 外层循环:for (i = 0; i < n - 1; i++),控制排序的轮数。因为经过n - 1轮,就可以将n个元素全部放置到正确位置,所以循环次数为n - 1。
  • 内层循环:for (j = i + 1; j < n; j++),用于在每一轮中从 i + 1 位置开始遍历数组,找出剩余元素中的最小元素的下标,并将其存储在min_index中。在遍历过程中,通过 if (arr[j] < arr[min_index]) 比较元素大小,如果找到比当前最小元素更小的元素,就更新min_index。
  • 交换操作:找到最小元素的下标min_index后,通过中间变量temp将最小元素与当前位置(i位置)的元素进行交换,即:
temp = arr[min_index];
arr[min_index] = arr[i];
arr[i] = temp;

        这样就将当前轮找到的最小元素放置到了它应该在的位置上。

主函数main

int main() {int numbers[10];printf("请输入十个整数:\n");for (int i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}selectionSort(numbers, 10);printf("排序后的结果为:\n");for (int i = 0; i < 10; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}
  • 首先定义一个长度为 10 的整型数组numbers,用于存储用户输入的十个数字。
  • 通过for循环和scanf函数,提示用户输入十个整数,并将输入的数字依次存储到数组numbers中。
  • 调用selectionSort函数对numbers数组进行排序,传入数组名和数组元素个数 10。
  • 最后再通过一个for循环和printf函数,将排序后的数组元素依次输出,展示排序结果。

三、代码运行示例

        假设我们输入十个数字:9 5 2 7 1 8 3 6 4 0,程序运行后,会输出排序后的结果:0 1 2 3 4 5 6 7 8 9 。每一个数字都按照从小到大的顺序被正确排列,这正是选择排序算法发挥作用的结果。

四、选择排序算法的时间复杂度和空间复杂度分析

时间复杂度

        选择排序的时间复杂度主要取决于两层嵌套循环。外层循环执行 n - 1 次,内层循环在第i次外层循环时执行 n - i 次。总的比较次数为(n - 1) + (n - 2) +... + 1 = n * (n - 1) / 2,所以选择排序的时间复杂度为O(n^2),其中n是数组元素的个数。这意味着,随着数组规模的增大,选择排序所需的时间会呈平方级增长,在处理大规模数据时效率较低。

空间复杂度

        在选择排序过程中,除了原数组外,只使用了几个额外的变量(如min_index、temp等)来辅助排序,这些变量所占用的空间是固定的,不随数组规模的变化而变化。因此,选择排序的空间复杂度为O(1),属于原地排序算法,不需要额外开辟大量的内存空间。

五、选择排序算法的优缺点

优点:

  • 简单直观:选择排序的原理和实现都非常简单,对于初学者来说,很容易理解和掌握,是学习排序算法的良好入门选择。​
  • 稳定且原地排序:在不考虑相等元素交换的情况下,选择排序是一种稳定的排序算法(如果在比较时遇到相等元素不交换位置,就能保证相等元素的相对顺序不变)。并且它不需要额外的大量内存空间,只需要几个辅助变量,空间复杂度低,适合在内存资源有限的环境下使用。​

缺点:​

  • 效率较低:由于其时间复杂度为O(n^2),在处理大规模数据时,排序所需的时间会急剧增加,相比一些高效的排序算法(如快速排序、归并排序等),性能较差。​
  • 交换次数较多:在选择排序过程中,即使数据已经部分有序,它仍然会按照固定的方式进行比较和交换操作,没有利用数据已有的有序性,这也是导致其效率低下的一个原因。

六、总结

        通过以上详细的讲解和代码实现,我们深入了解了选择排序算法,并成功使用 C 语言对十个数字进行了排序。选择排序虽然在处理大规模数据时效率不高,但它简单易懂的特性使其成为学习排序算法的重要基础。同时,通过对选择排序的学习,我们也对 C 语言数组的操作、循环结构以及函数的使用有了更深入的理解。在实际编程中,我们可以根据具体的数据规模和需求,选择合适的排序算法来提高程序的性能和效率。希望本文能帮助大家更好地掌握选择排序算法。

        如果你对选择排序算法还有其他疑问或文章中有不对的地方,欢迎交流指正!

相关文章:

  • ubuntu24设置拼音输入法,解决chrome不能输入中文
  • 排序(C)
  • NLP高频面试题(五十二)——BERT 变体详解
  • Docker Python 官方镜像使用说明(TAG说明)
  • vim的.vimrc配置
  • 前端加密介绍与实战
  • 46. 全排列
  • Mysql之存储过程
  • 多源数据集成技术分析与应用实践探索
  • DeepSeek在物联网设备中的应用:通过轻量化模型实现本地化数据分析
  • 达妙电机CAN通信及实验
  • 努比亚Z70S Ultra 摄影师版将于4月28日发布,首发【光影大师990】传感器
  • GPLT-2025年第十届团体程序设计天梯赛总决赛题解(共计266分)
  • Go全栈_Golang、Gin实战、Gorm实战、Go_Socket、Redis、Elasticsearch、微服务、K8s、RabbitMQ全家桶
  • Laravel 自定义 Artisan 命令行
  • Qt案例 使用QFtpServerLib开源库实现Qt软件搭建FTP服务器,使用QFTP模块访问FTP服务器
  • TORL:解锁大模型推理新境界,强化学习与工具融合的创新变革
  • 第六章 QT基础:3、QT的打包和部署
  • 在串的简单模式匹配中,当模式串位j与目标串位i比较时,两字符不相等,则i的位移方式是?
  • 《数据结构世界的乐高积木:顺序表的奇幻旅程》
  • 中国工程院院士、歼八Ⅱ飞机系统工程副总设计师温俊峰逝世
  • 叶迪奇任陆金所控股董事长,赵容奭继续担任CEO
  • 生态环境部:我国正在开展商用乏燃料后处理厂的论证
  • 主刀完成3万余例手术,81岁神经外科学专家徐启武逝世
  • 甘肃省政府原副省长赵金云严重职务违法被开除公职
  • 兰斯莫斯想在雅典卫城拍《拯救地球》,希腊官方:价值观不符