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

C语言经典算法之直接排序算法

目录

前言

一、代码实现

二、时空复杂度

时间复杂度:

空间复杂度:


前言

建议:1.学习算法最重要的是理解算法的每一步,而不是记住算法。

           2.建议读者学习算法的时候,自己手动一步一步地运行算法。

tips:希尔排序算法就是通过该算法衍生出来的,通过理解本算法可以为理解希尔排序打下基础。同时,本算法的逻辑简单。

直接排序算法,也称为选择排序(Selection Sort),是一种简单直观的排序算法。其基本思想是每一趟从待排序的数据元素中选择最小(或最大)的一个元素,将它与序列的第一个元素进行交换,然后再从剩余的元素中选择最小(或最大)的元素,与序列的第二个元素进行交换,如此循环,直到整个序列有序。总结就是,将无序元素与其前面的元素比较大小,以此来确定其位置,从而将其加入前面的有序的部分。

一、代码实现

#include <stdio.h>// 交换数组中两个元素的值
void swap(int *xp, int *yp) {int temp = *xp;*xp = *yp;*yp = temp;
}// 直接排序函数
void selectionSort(int arr[], int n) {int i, j, min_idx;// 选择排序的主循环for (i = 0; i < n-1; i++) {// 寻找在未排序部分中的最小元素的索引min_idx = i;for (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排序后的数组: \n");printArray(arr, n);return 0;
}

在这段代码中,swap 函数用于交换数组中两个元素的值,而 selectionSort 函数实现了直接排序算法。主要的思路是在未排序的部分中找到最小元素的索引,然后与当前位置的元素进行交换,通过不断进行这样的操作,实现整个数组的排序。

二、时空复杂度

时间复杂度:

直接排序算法的时间复杂度主要由两层循环决定。

外层循环:外层循环的次数是 n-1,其中 n是数组的长度。这是因为在进行 n-1次选择后,剩下的最后一个元素已经有序了。

内层循环:内层循环用于在未排序的部分中寻找最小元素的索引。在最坏情况下,每次选择都需要遍历剩余未排序的元素。内层循环的次数是n,n-1,n-2,…,1。其平均时间复杂度为O(n^2)

综合考虑外层和内层循环(只要考虑n的次数大的复杂度),直接排序的时间复杂度为O(n^2)

平均/最好/最差时间复杂度均为O(n^2)

空间复杂度:

直接排序是一种原地排序算法,它只需要常数级别的额外空间来存储少量的辅助变量,如循环中的索引和临时变量。因此,直接排序的空间复杂度为 O(1),即常数级别的额外空间。

http://www.lryc.cn/news/280407.html

相关文章:

  • 前端开发vscode 常用插件记录
  • 基于JavaWeb+BS架构+SpringBoot+Vue基于web的多媒体素材管理系统的设计和实现
  • 常用的dom操作
  • Hotspot源码解析-第十七章-虚拟机万物创建(三)
  • Spring MVC 的RequestMapping注解
  • navicat for oracle
  • 行业分享----dbaplus174期:美团基于Orchestrator的MySQL高可用实践
  • springboot集成钉钉通知
  • 直播预告丨看零售场,如何玩转 MaaS
  • 高创新!EI论文复现+改进:聚合温度调控策略的综合能源系统/微电网/虚拟电厂多目标优化调度程序代码!
  • 详解Matlab深度学习进行波形分割
  • 如何在Windows 10/11的防火墙中禁止和允许某个应用程序,这里提供详细步骤
  • vivado 添加现有IP文件、生成IP
  • C++右值引用,右值引用与const引用的区别
  • 启英泰伦推出「离线自然说」,离线语音交互随意说,不需记忆词条
  • Vulnhub-DC1
  • 【c++笔记】总结!c++与c语言的不同之处
  • 大模型PEFT技术原理(一):BitFit、Prefix Tuning、Prompt Tuning
  • VMware vSphere运维管理手册
  • 学习笔记-mysql-各种函数的基本使用
  • DD小桔高级数分 2面挂
  • 居中面试问题
  • 网页设计-用户体验
  • docker应用:vocechat
  • linux 02 vmware的快照,文件管理
  • 项目架构之Zabbix部署
  • RocketMQ源码阅读-Message消息存储
  • 《C语言学习》---郝斌版---笔记
  • Python(32):字符串转换成列表或元组,列表转换成字典小例子
  • CentOS 7 安装私有平台OpenNebula