排序算法(C语言版)
文章平均质量分 86
C语言实现八大经典排序:冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、计数排序,基数排序
花想云
新星计划导师、C/C++领域新星创作者、运维领域新星创作者、阿里云专家博主、华为云云享专家、CSDN内容合伙人。本科在读,致力于C/C++方向的学习,同时涉及Linux操作系统学习、数据结构与算法、数据库MySQL……
展开
-
『初阶数据结构 • C语言』② - 算法为何重要
算法这个词听起来很深奥,其实不然。它只是解决某个问题的一套流程。准备一碗麦片的流程也可以说是一种算法,它包含以下 4步(对我来说是 4步吧)。(1) 拿个碗。(2) 把麦片倒进碗里。(3) 把牛奶倒进碗里。(4) 把勺子放到碗里。在计算机的世界里,算法则是指某项操作的过程。上一章我们研究了 4种主要操作,包括读取、查找、插入和删除。这一章我们还是会经常提到它们,而且一种操作可能会有不止一种做法。也就是说,一种操作会有多种算法的实现。原创 2022-12-16 14:45:40 · 1067 阅读 · 70 评论 -
『初阶数据结构 • C语言』⑥ - 插入排序&希尔排序
之前我们衡量一个算法的效率时,都是着眼于它在最坏情况下需要多少步。原因很简单,连最坏的情况都做足准备了,其他情况自然不在话下。但是,在我们实际生活中并不总是面临最坏情况,更多的是平均情况。本章我们会见证一种自适应性极强的排序算法---希尔排序,还有它的组成它的关键---插入排序。懂得区分最好、平均、最坏情况,是为当前场景选择最优算法以及给现有算法调优以适应环境变化的关键。记住,虽然为最坏情况做好准备十分重要,但大部分时间我们面对的是平均情况。原创 2023-01-04 12:40:02 · 1277 阅读 · 117 评论 -
『初阶数据结构 • C语言』⑭ - C语言实现用堆解决 TOP-K 问题
生活中我们经常能见到TopK问题,例如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。所以,TopK问题即求出一组数据中前K个最大或最小的元素,一般情况下,数据量都比较大。对于TopK问题,我们首先想到的可能是排序,对数据排好序以后,取前K个元素。但是,面对庞大的数据量时,排序并不适用,因为加载庞大的数据到内存中是个不小的消耗。所以,对于TopK问题,最佳的解决方式是用堆原创 2023-02-23 10:00:00 · 1751 阅读 · 103 评论 -
『初阶数据结构 • C语言』⑤ - 选择排序
大 O 是一种能够比较算法效率,并告诉我们在特定环境下应采用何种算法的伟大工具。但我们不能完全依赖于它。因为有时候即使两种算法的大 O 记法完全一样,但实际上其中一个比另一个要快得多。本章我们就来学习如何分辨那些效率貌似一样的算法,从而选出较快的那个。现在我们已经掌握了一些非常强大的算法分析手法。我们能够使用大 O去判断各种算法的效率,即便两种算法的大 O记法一样,也知道如何对比它们。不过在对比算法时,还需要考虑一个重要因素。至今我们关注的都是最坏情况下算法会跑得多慢,但其实最坏情况并不总会发生。原创 2023-01-02 10:55:15 · 923 阅读 · 63 评论 -
『初阶数据结构 • C语言』③ - 算法分析专业工具——大O记法
学会大 O记法,我们在比较算法时就有了一致的参考系。有了它,我们就可以在现实场景中测量各种数据结构和算法,写出更快的代码,更轻松地应对高负荷的环境。原创 2022-12-17 15:45:08 · 1959 阅读 · 101 评论 -
『初阶数据结构 • C语言』⑱ - 归并排序有多简单?一幅图教你看懂
归并排序的递归实现代码实现归并排序的非递归实现代码实现归并排序的思想很简单——分治法。简单地说,归并排序的是将序列拆分成几段子序列,将每一段子序列分别进行排序,排好之后再将有序的子序列归并(有点像合并两个有序数组)成为一个有序的序列。原创 2023-03-13 16:32:26 · 628 阅读 · 39 评论 -
『初阶数据结构 • C语言』④ - 冒泡排序
大 O记法能客观地衡量各种算法的时间复杂度,是比较算法的利器。我们也试过用它来对比二分查找和线性查找的步数差异,发现二分查找的步数为 O(log N),比线性查找的 O(N)快得多。然而,写代码的时候并不总有这样明确的二选一,更多时候你可能就直接采用首先想到的那种算法了。不过有了大 O的话,你就可以与其他常用的算法比较,然后问自己:“我的算法跟它们相比,是快还是慢?”如果你通过大 O 发现自己的算法比其他的要慢,你就应该退一步,好好想想怎样优化它,才能使它变成更快的那种大 O。原创 2022-12-20 16:21:37 · 1022 阅读 · 128 评论 -
『初阶数据结构 • C语言』⑰ - 快速排序(hoare法、挖坑法、前后指针法与非递归实现)
快速排序是霍尔大佬在1962年提出的排序方法,因其出色的排序效率使得它成为使用最广泛的排序算法。快速排序之所以敢叫做快速排序,自然是有一定的道理,今天我们就来看看快速排序是如何凌驾于其它算法之上的。快速排序的基本思想是:任取待排序数列中的一个数作为 key 值,通过某种方法使得 key 的左边所有的数都比它小,右边的数都比它大;以 key 为中心,将 key 左边的数列与右边的数列取出,做同样的操作(取 key 值,分割左右区间),直至所有的数都到了正确的位置。原创 2023-03-11 22:41:00 · 1036 阅读 · 84 评论 -
『初阶数据结构 • C语言』⑬ - 堆排序详解【附完整源码】
你是否对堆排序早有耳闻?身为经典排序算法中的佼佼者,我们着实有必要学习一下堆排序的实现。接下来我们就一起认识一下堆排序是如何依靠它优秀的结构及算法在众多的排序算法中脱颖而出的。原创 2023-02-03 21:35:14 · 1270 阅读 · 66 评论 -
『初阶数据结构 • C语言』⑲ - 一分钟学会计数排序
计数排序是一种非比较排序。它的主要思想是建立一个临时数组 CountArr ,用来统计序列中每个元素出现的次数,例如若序列元素 n 一共出现了 m 次,则使 CountArr [n] = m;统计完毕后。根据统计的结果,将序列按顺序插入到原数组中即完成排序。计数排序时间复杂度为O(N+range),空间复杂度为 O(range)。计数排序看着貌似比快排还要厉害,但是它的局限性较高。计数排序适合范围集中的数据,并且只适合整型数据。原创 2023-03-14 12:26:35 · 1086 阅读 · 26 评论