十大经典排序算法(代码实现),建议收藏

news2024/11/23 23:43:59

兜兜转转,一晃年关将至。时间证明了一个道理,学啥忘啥,学的越快忘得越快,还不如踏踏实实写点笔记心得来的实在。

编程初学期间,排序算法是让人抓头最多的一块。为什么我连最简单的冒泡排序都理解不了,我是不是不选错专业了,很多人会有这样的疑问,然后就有人做gif冒泡懵逼排序,别说,还挺形象的。

其实排序算法这块,着急不得,这个排序算法不会就换一个排序算法来学,总有一种排序算法你能够理解的,等需要用到排序的时候,你只要会一种就可以了。

在这里我列举了7中常见的排序算法并用C语言实现,你们可能就要问了,不是十种吗?怎么还能缺斤短两,不是我不会写啊,是写起来麻烦,你们也用不到后面那几种,跟别说去研究了,能看懂常见的七种排序算法你就能在学校里横着走了。

后台回复【排序算法】可以拿到全部代码

目录

一、冒泡排序

二、选择排序

三、插入排序

四、快速排序

五、希尔排序

六、归并排序

七、桶(基数)排序

01

冒泡排序

相信大家最熟悉的就是冒泡排序了,这个我就不多说

直接上动图演示原理,外加代码实现冒泡排序:

C语言代码实现:​​​​​​​

void BubbleSort(int arr[], int n){  //从小到大排序 相邻来两个数比较,将大的数字往后放  for (int i = 0; i < n - 1; i++)      //n-1是因为数组下标最大为n-1 要进行10轮比较  {    //n-1是因为数组下标最大为n-1 要进行10次比较,再减i是因为每最后的i个元素已经有序不需要继续排序    for (int j = 0; j < n - 1 - i; j++)    {      if (arr[j] > arr[j + 1])      //两两比较,将小的数据放前面      {        swap(arr, j + 1, j);        //交换arr数组arr[j+1]和arr[j]的值      }    }  }}//交换函数后面就不列举了,凡是swap都是下面代码实现的void swap(int arr[], int x, int y){  int temp = arr[x];  arr[x] = arr[y];  arr[y] = temp;}

02

选择排序

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾,重复操作。

动图演示原理,外加代码实现选择排序:

C语言代码实现:​​​​​​​

void SelectSort(int arr[], int n){  for (int i = 0; i < n - 1; i++)  {    for (int j = i + 1; j < n; j++)    {      if (arr[i] > arr[j])      {        swap(arr, i, j);  //交换arr数组arr[i]和arr[j]的值      }    }  }}

03

插入排序

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的,就是将未排序的数字插入到已排序的数列中

动图演示原理,外加代码实现插入排序:

C语言代码实现:​​​​​​​

void InsertSort(int arr[], int n){  int tempVal;  for (int i = 1, j; i < n; i++)  {    tempVal = arr[i];  //保存要插入的值    for (j = i - 1; tempVal < arr[j] && j >= 0; --j)  //数据往后移动,给要插入的值腾位    {      arr[j + 1] = arr[j];    }    arr[j + 1] = tempVal;  //插入数据  }}

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。插入排序是将未排序的数字插入到已排序数列中,而希尔排序是将一个已排序的数列插入到另一个已排序的数列中。

示意图演示原理,外加代码实现希尔排序:

C语言代码实现:​​​​​​​

void ShellSort(int arr[], int n){  int tempVal, j;  int jump = n >> 2;      //步长值  while (jump != 0)  {    for (int i = jump; i < n; i++)    {      tempVal = arr[i];  //保存待排序的第一个数,也就是待插入的数      for (j = i - jump; j >= 0 && tempVal < arr[j]; j -= jump)      {        arr[j + jump] = arr[j];      }      arr[j + jump] = tempVal;    }    jump = jump >> 1;    //步长值减半  }}

06

归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。

示意图演示原理,外加代码实现归并排序:

C语言代码实现:

void MergeSort(int arr[], int left, int right){  if (left >= right)//递归的终止条件,left == right证明这个区间只有一个元素,不需要再拆了    return;  int mid = ((right - left) >> 1) + left;//求中点  MergeSort(arr, left, mid);    //拆分左  MergeSort(arr, mid + 1, right);  //拆分右  //并操作  _merge_in_arr(arr, left, mid, right);}
void _merge_in_arr(int arr[], int left, int mid, int right){  int length = right - left + 1;          //定义一个辅助的空间的长度  int *pData = (int*)malloc(sizeof(int)*length);//分配一个动态内存来调整元素的位置  memset(pData, 0, sizeof(int)* length);
  //合并  int low = left;    //左边区间的起始下标  int hig = mid + 1;  //右边区间的起始下标  int index = 0;    //辅助数组的下标
  while (hig <= right)//右区间没有合并完  {    while (low <= mid && arr[low] <= arr[hig])//证明左区间没有合并完,且左区间的值小于右区间的值    {      pData[index] = arr[low];      //把左边的值放进辅助数组      low++;                //左边往高位移,下一次需要判断左边的新下标      index++;              //下一次放进辅助数组的新下标    }    if (low > mid)  //证明左区间已经放完      break;
    while (hig <= right && arr[low] > arr[hig])//证明右区间没有合并完,且左区间的值大于右区间的值    {      pData[index] = arr[hig];      //把右边的值放进辅助数组      hig++;                //右边往高位移,下一次需要判断右边的新下标      index++;              //下一次放进辅助数组的新下标    }  }
  //到这一步,证明起码有一个区间已经合并完成  if (hig <= right)  //证明右边没有完成    memmove(&pData[index], &arr[hig], sizeof(int)* (right - hig + 1));  if (low <= mid)    //证明左边没有完成    memmove(&pData[index], &arr[low], sizeof(int)* (mid - low + 1));
  //把所有区间都合并到了辅助区间  memmove(&arr[left], pData, sizeof(int)* length);  free(pData);  //释放空间}

07

桶排序

桶排序是典型的空间换时间,在对整数排序中,没有什么算法能比它还快,但是在空间浪费上,它是祖宗。

示意图演示原理,外加代码实现桶排序:

C语言代码实现:​​​​​​​

void radix_sort(int arr[], size_t len){  int**temp = (int **)malloc(sizeof(int) * 10);  //10行  //申请动态内存   辅助数组temp[10][];  for (int i = 0; i < 10; i++)  {    temp[i] = (int *)malloc(sizeof(int)*len);  }
  for (int i = 1; i <= 100; i *= 10)//循环数值可能有的位数  {    for (int x = 0; x < 10; ++x)//辅助数组行循环    {      for (int y = 0; y < len; ++y)//辅助数组列循环      {        temp[x][y] = -1;//辅助数组的初始化赋值,-1表示在arr里面不可能出现的数值       }    }    //arr数组中的元素放入辅助数组    for (int m = 0; m < len; ++m)    {      int index = (arr[m] / i) % 10;      temp[index][m] = arr[m];    }    //把辅助数组的内容放回待排序数组    int k = 0;//待排序的下标    for (int x = 0; x < 10; x++)    {      for (int y = 0; y < len; ++y)      {        if (temp[x][y] != -1)          arr[k++] = temp[x][y];      }    }  }  //释放内存  for (int i = 0; i < 10; i++)  {    free(temp[i]);  }  free(temp);}

算法复杂度

这个算法的复杂度纯理论,我就放到最后来讲

一个时间复杂度,一个空间复杂度

一个稳定,一个不稳定

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面

不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面

时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律

空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

附录:

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

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

相关文章

webpack基础知识

webpack基础知识 1、定义2、环境安装3、初始化项目4、简单使用 1、定义 webpack的本质是一个第三方模块包&#xff0c;用于分析&#xff0c;并打包代码 支持所有类型的文件打包支持less/sass> css支持ES6/7/8>ES5压缩代码&#xff0c;提高加载速度 2、环境安装 yarn安…

Java并发编程中的HashMap、HashTable、ConcurrentHashMap

1、HashMap 1.1、为什么HashMap非线程安全的 &#xff08;1&#xff09;竞态条件 当多个线程同时对 HashMap 进行写操作&#xff08;如插入、删除、修改&#xff09;&#xff0c;由于没有同步控制&#xff0c;可能会导致数据不一致的情况。例如&#xff0c;两个线程同时向同…

LLM 生成视频 - pika

文章目录 关于 pika申请试用2023-07-12 关于 pika A powerful Text-to-Video platform that can unleash your creativity simply by typing. 官网: https://www.pika.art/官方 twitter : https://twitter.com/pika_labs相关功能介绍 相关报道/博客: 图片生成视频 from : h…

如何给视频配音?这几种配音方法一看就会

怎么给视频进行配音呢&#xff1f;如果原始视频的录音质量较差&#xff0c;存在噪音、回音或杂音等问题&#xff0c;配音可以用来替换原始音频&#xff0c;以提高声音质量和清晰度&#xff0c;或者是我们想要给视频配上一段搞笑的方言配音&#xff0c;怎么怎么做呢&#xff1f;…

超级自动化的3年:财务、IT等通用场景占比高达65%,垂直领域玩家开始晋级

从信息化时代走向数字化时代&#xff0c;企业的最终目标即利用先进的数字技术完成数字化转型升级&#xff0c;而这绝不是将业务、流程、数据、表单等搬到线上就“完事⼉”。 在此背景下&#xff0c;Gartner于2019年提出“超级自动化”&#xff0c;之后全球范围内越来越多的企业…

【C++】-关于vector的两个习题(二维数组和多路递归)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你…

论文浅尝 | 少样本学习的语言模型的持续训练

笔记整理&#xff1a;王贵涛&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理 链接&#xff1a;https://github.com/UIC-Liu-Lab/CPT 一、动机 克服灾难性遗忘&#xff08;CF&#xff09;是持续学习&#xff08;CL&#xff09;的一个主要目标。目前有许多方法&…

施密特(Gram-Schmidt)正交化

引自于点击打开 如果没有空间向量解析几何基础&#xff0c;理解起来有些困难&#xff0c;因此稍微解说一下。 两个向量的正交变换我们分为3步&#xff1a; &#xff08;a1,a1)/ (|a1| * |a2|)是a1,a2之间的夹角的cos值cos值乘以|a2|后&#xff0c;得到a2在a1上映射的长度值&…

从浏览器进程角度分析从输入URL到页面显示发生了什么?

一、处理用户在浏览器地址栏中输入的URL&#xff08;统一资源定位符&#xff09; 用户在地址栏输入内容并按下回车&#xff0c;浏览器会检查输入是否符合 URL 规则&#xff0c;以Chrome为例&#xff0c;它会根据相应的规则&#xff0c;将地址栏输入解析成搜索请求或者URI请求。…

YOLOv8实战垃圾分类目标检测 (视频课程)

课程链接&#xff1a;https://edu.csdn.net/course/detail/38804 垃圾分类是一项利国利民的民生工程&#xff0c;需要全社会的共同参与。 YOLOv8是前沿的目标检测技术&#xff0c;它基于先前 YOLO 版本在目标检测任务上的成功&#xff0c;进一步提升性能和灵活性。 本课程将手…

已解决 BrokenPipeError: [Errno 32] Broken pipe

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

第三次CCF计算机软件能力认证

第一题&#xff1a;门禁系统 涛涛最近要负责图书馆的管理工作&#xff0c;需要记录下每天读者的到访情况。 每位读者有一个编号&#xff0c;每条记录用读者的编号来表示。 给出读者的来访记录&#xff0c;请问每一条记录中的读者是第几次出现。 输入格式 输入的第一行包含一个整…

《前端开发 实践之 腾讯地图API 学习》

目录 腾讯地图基础入门方式一方式二 事件监听监听地图瓦片加载完成事件 移除缩放控件 & 旋转控件 & 比例尺控件初始化marker图层创建信息窗点击地图拾取坐标打点标记反解析成详细地址根据输入详细地址 反解析成经纬度 腾讯地图 腾讯地图API学习-官方地址&#xff1a;ht…

浅谈Web前端开发软件包管理器—Bower的基本使用

前言 Bower 是一个客户端的软件包管理器&#xff0c;它可用于搜索、安装和卸载如 JavaScript、HTML、CSS 之类的网络资源&#xff0c;Bower 是 Web 开发中的一个前端文件包管理器&#xff0c;类似于 Node 模块的 npm 包管理器&#xff0c;bower 依赖于 Git、Node 和 npm。 安…

HarmonyOS课程尝鲜计划,优享特权大礼包

报名入口&#xff1a;https://developer.huawei.com/consumer/cn/activity/901689042385499023

Mendix Excel导入组件的分析和应用

一、前言 企业在发展的过程中会使用各种各样的系统&#xff0c;其中很多系统用了5-10年&#xff0c;我们称之为遗留系统存在诸多风险&#xff1a;维护耗时、中断频繁、用户不友好、与新软件的兼容性问题等。总有一天&#xff0c;这些庞大的问题会垄断IT资源&#xff0c;使数字…

事物的属性与观察者有关吗?

我们通常对世界的看法是以分析和概念为基础的&#xff0c;我们倾向于将事物划分为各种相对的存在和概念。然而&#xff0c;有些领域超越了这种相对的观点&#xff0c;揭示了所有现象的无常性、空虚性和无自性&#xff0c;认识到它们的真实本质。如在人机环境系统中就认为&#…

【车载Android】多用户(一) - Linux用户与Android多用户

现如今手机这样的移动设备已经是人手一台了&#xff0c;但是汽车依然是以家庭为单位使用&#xff0c;不同的家庭成员对于汽车的使用存在着差异&#xff0c;比如空间、功能、影音风格等。因此&#xff0c;“智能汽车”需要具备千人千面的特性&#xff0c;能够适应不同的用户和场…

Linux中Makefile详细教程

目录 Makefile Makefile的介绍 Makefile简单的编写 .PHONY 问题&#xff1a; 如果只执行make&#xff0c;它执行的是Makefile里哪一段语句呢&#xff1f; 怎么知道我的可执行程序是最新的呢&#xff1f; Makefile编译多个文件 进度条小程序 Makefile Makefile的介绍 …

Acwing.860 染色法判定二分图(二分图染色法)

题目 给定一个n个点m条边的无向图&#xff0c;图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数n和m。 接下来m行&#xff0c;每行包含两个整数u和v&#xff0c;表示点u和点v之间存在一条边。 输出格式 如果给定图是二分图&#xff0c…