c语言sort_C语言十大排序算法,让老师对你刮目相看的技巧

13a7a5e15f1ebe9ff5a7bfd9925e692f.png

排序算法作为数据结构的重要部分,系统地学习一下是很有必要的。

十种常见排序算法可以分为两大类:

比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。

非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

86a62421135147f008d53cde5f61da16.png

全部排序代码整理:

链接:https://pan.baidu.com/s/1c02Nfm8PjXg0PQtFRv6F1A

提取码:rjnq

1、冒泡排序

它重复地走访过要排序的元素列,依次比较两个相邻的元素
  • 动图演示

1a01cc2200ce872a50776374390c1a09.gif
  • 代码实现
void 

2、选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
  • 动图演示

fceb37209caf52d4cad86e1c6cf91d78.gif
  • 代码实现
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]的值}}}
}

3、插入排序

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据
  • 动图演示

d0718a093175709128451c7fda54555b.gif
  • 代码实现
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;  //插入数据}
}

4、快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
  • 动图演示

88665b22d44c433d20e12f5904f6c25a.gif
  • 代码实现
void Quicksort(int a[], int low, int high)
{if (low >= high){return;}int first = low;int last = high;int key = a[first];while (first<last){while (first < last && a[last] >= key)    //从右往左找一个比arr[left]小的值{--last;}a[first] = a[last];while (first < last && a[first] <= key)    //从左往右找一个比arr[left]要大的值{++first;}a[last] = a[first];}a[first] = key;Quicksort(a, low, first - 1);    //排左边Quicksort(a, last + 1, high);    //排右边
}

5、希尔排序

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

67bba7a80248888eceeaa1e4cf00cae7.png
  • 代码实现
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;    //步长值减半}
}

6、归并排序

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表
  • 动图演示

372f612087596ab7c4faf37814a30ce6.gif
  • 代码实现
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);  //释放空间
}

7、桶(基数)排序

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

9b6ed76b1746cb087faf8f9779a24f93.gif
  • 代码实现
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);
}

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


编辑:梦凡

微信公众号:编程学习基地

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

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

相关文章

vim复制粘贴_打造一款高逼格的Vim神器

Vim 是一个上古神器&#xff0c;本篇文章主要持续总结使用 Vim 的过程中不得不了解的一些指令和注意事项&#xff0c;以及持续分享一个开发者不得不安装的一些插件&#xff0c;而关于 Vim 的简介&#xff0c;主题的选择&#xff0c;以及为何使用 vim-plug 来管理插件等内容&…

python列表嵌套字典取值_我的 python 学习历程-Day05 字典/字典的嵌套

一、字典的初识为什么要有字典字典与列表同属容器型数据类型&#xff0c;同样可以存储大量的数据&#xff0c;但是&#xff0c;列表的数据关联性不强&#xff0c;并且查询速度比较慢&#xff0c;只能按照顺序存储。什么是字典先说一下什么叫可变与不可变的数据类型分类不可变&a…

s8050三极管经典电路_曝光一个产品级的红外发射电路

作者&#xff1a;瑞生&#xff0c;来源&#xff1a;科技老顽童微信公众号&#xff1a;芯片之家(ID&#xff1a;chiphome-dy今天给大家一个产品级的红外发射电路。为什么说是产品级的&#xff1f;因为这个电路我已经在各类产品上见过多次&#xff01;很多小伙伴学电子有一个误区…

es6删除数组某一项_精学手撕系列——数组扁平化

参考文章&#xff1a;面试官连环追问&#xff1a;数组拍平(扁平化) flat 方法实现编者荐语&#xff1a;在前端面试中&#xff0c;手写flat是非常基础的面试题&#xff0c;通常出现在笔试或者第一轮面试中&#xff0c;主要考察面试者基本的手写代码能力和JavaScript的基本功。今…

iqc工作职责和工作内容_监理工程师工作职责

1&#xff0e;安全监理员是项目安全生产日常监理工作的主要实施者&#xff0c;代表总监理工程师在项目工程监理过程中行使项目安全生产监理的职责。2&#xff0e;安全监理员应认真贯彻执行《建设工程安全生产管理条例》&#xff0c;贯彻执行劳动保护、安全生产的方针政策、法令…

webservice 实现与his系统对接_[Share] EDI 及其他常见系统对接技术

近期&#xff0c;有客户提及&#xff1a;你们有没有对接技术相关的介绍&#xff0c;不同系统之间的对接技术&#xff0c;现在企业内部系统比较多&#xff0c;有自主开发的&#xff0c;有外部采购的&#xff0c;所以我们想了解一下对接技术相关的信息。小知马不停蹄的做了下功课…

php弱类型漏洞,php代码审计之弱类型引发的灾难

天融信阿尔法实验室 李喆有人说php是世界上最好的语言&#xff0c;这可能是对开发人员来说&#xff0c;确实有这方面的特点&#xff0c;因为它开发起来不像其他语言那样麻烦&#xff0c;就比如&#xff1a;弱类型&#xff0c;它不需要像java等语言那样明确定义数据类型。这给开…

大学计算机基础python第二次作业_第二次python作业-titanic数据练习

原博文 2019-10-14 14:45 − 一、读入titanic.xlsx文件&#xff0c;按照教材示例步骤&#xff0c;完成数据清洗。 titanic数据集包含11个特征&#xff0c;分别是&#xff1a; Survived:0代表死亡&#xff0c;1代表存活Pclass:乘客所持票类&#xff0c;有三种值(1,2,3)Name:乘客…

微小宝公众号排行榜_榜单 广东省技工院校微信公众号排行榜(第51期)

▼2020年10月榜单出炉&#xff01;本期榜单最大看点&#xff0c;莫过于发文33篇的劳模代表——“广东高新技术高级技校”以高达830.49的微信传播指数WCI&#xff0c;荣登第51期广东省技工院校微信公众号排行榜榜首&#xff01;截至本期&#xff0c;实力一向强劲的“广东高新技术…

word公式编辑器_【Word技巧】word使用终极技巧,工程人必会(四)

1、问&#xff1a;Word中怎么在一个英文字母上打对号&#xff1f;答&#xff1a;透明方式插入图片对象&#xff0c;内容是一个√2、问&#xff1a;Word里怎么显示修订文档的状态&#xff1f;文档修订后&#xff0c;改后标记很多&#xff0c;但是在菜单里没有“显示修订最终状态…

加载oracle属性文件,关于属性文件的详细介绍

我们通常会将Java应用的配置参数保存在属性文件中&#xff0c;Java应用的属性文件可以是一个正常的基于key-value对,以properties为扩展名的文件&#xff0c;也可以是XML文件. 在本案例中&#xff0c;將会向大家介绍如何通过Java程序输出这两种格式的属性文件&#xff0c;并介绍…

android 访问服务器sql_XSS 攻击、CSRF 攻击、SQL 注入、流量劫持(DNS 劫持、HTTP 劫持)—— 浏览器安全

今天看了 jsliang 大佬关于网络安全的文章&#xff0c;为了加深一下印象&#xff0c;自己动手写一下。 主要参考文章&#xff1a;网络安全 ——— jsliang XSS攻击 XSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击&#xff0c;指的是向网页注入恶意代码&#xff0c;…

simulink和psim仿真结果不同_在HFSS进行AC耦合电容仿真优化怎么做?

AC耦合电容&#xff0c;也叫DC blocking隔直电容&#xff0c;在几乎所有的高速串行链路中&#xff0c;都可以看到它的身影&#xff0c;它的主要作用是去掉信号中的直流偏置分量&#xff0c;同时让高频分量可以顺利通过&#xff0c;类似于一个高宽带的滤波器。由于电容的焊盘通常…

民生银行 一码付 php,PHP开心码支付免签约第四方支付平台源码修复版

源码说明后台号码admin后台密码123456声明&#xff1a;该源码仅供学习出现&#xff0c;修复者不承担任何责任&#xff0c;下载安装即代表使用者自行承担责任源码安装方法需要服务器开启g11插件PHP5.6&#xff0c;主机用户推荐95云主机&#xff0c;因为已经开启所有扩展插件必须…

oracle主从表分离怎么实时更新数据_高可用数据库UDB主从复制延时的解决

MySQL主从复制的延时一直是业界困扰已久的问题。延时的出现会降低主从读写分离的价值&#xff0c;不利于数据实时性较高的业务使用MySQL。UDB是UCloud推出的云数据库服务&#xff0c;上线已达六年&#xff0c;运营了数以万计的UDB MySQL实例。除了提供高可用、高性能、便捷易用…

vp翻N_VP刀叨叨:如何让G胖给你唱生日歌

VS看起来好凶喵▼ESL欧洲&独联体区VP发推庆祝击败OG昨晚第九个比赛日&#xff0c;OG与VP的比赛无疑是大家关注的焦点&#xff0c;一边是TI双冠王&#xff0c;一边是状态开始回升的俄罗斯毛熊&#xff0c;大家都很期待他们能给我们带来精彩的比赛。不过比赛结果却出乎了不少…

秒后面的单位是什么_为什么兰州马拉松很难跑出好成绩?

如果要评选中国最难PB的马拉松&#xff0c;西北第一马兰州马拉松当之无愧可以排名第一。为什么这么说呢&#xff1f;先来看下今年兰马的一组数据&#xff0c;不管是精英选手还是大众选手&#xff0c;成绩都要比个人PB慢。国内男子冠军是管油胜&#xff0c;成绩为2小时18分58秒&…

surface php老是用不了,surface pro7触摸屏没反应怎么办

发生该问题的原因可能是&#xff1a;有很多可能原因&#xff0c;从校准到硬件或者固件。故障排查可以找到根本原因。1. 清洁屏幕将柔软的无绒布蘸上水或眼镜清洗液来清洁屏幕&#xff0c;但不要直接在屏幕上喷洒液体。2. 重启 Surface注意&#xff1a;你将需要连接键盘或鼠标到…

小优优(u盘歌曲顺序调整)_电脑从U盘启动,这三种方式你知道吗?

Windows 可以运行在数千台不同配置的电脑上, 但安装 Windows 10又是另一回事, 具体取决于你的电脑是否安装了现有的 Windows 10,以及早期版本,像是 Windows7, Windows XP, 或完全不同的操作系统(如 macOS 或 Linux)。大多数情况, 安装系统都依赖于主硬盘HDD或SSD以外的设备启动…

unity vs没有智能提示_Unity博主营地你不可不知的Unity C#代码小技巧

「Unity博主营地第一期」于2019年11月开启&#xff0c;现已收到数百篇原创投稿。每周根据Unity Connect社区反馈&#xff0c;帮助大家发现最优质、最干货、最受欢迎的博文作品。开门见山的说&#xff0c;这篇文章干到挤不出一点水分。文章主要针对Unity初学者&#xff0c;相信读…