首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据结构】八排序之计数排序算法

作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。...算法动图演示如下: 计数排序的实现思路: 统计每个数据出现的次数 按序输出 虽然计数排序实现思路比较简单,但我们还是有一些细节需要注意: 绝对映射和相对映射: 绝对映射:如下图,数据的数值和数组下标是一一对应的...,这种计数方式叫做绝对映射 绝对映射的缺点:开辟数组占用空间,不能够排负数 相对映射:如下图,数据在数组中是按照数值的相对大小来映射的,这种计数方式叫做相对映射....相对映射较好的解决了绝对映射的缺点,但当遇到待排数据分布较为分散且跨度较大时,就不太适合使用计数排序来进行排序了....二.计数排序代码实现 算法实现步骤:(以升序为例) 遍历待排数组,找出数组中的最大值max和最小值min. 开辟大小为max-min+1小的数组用以计数. 遍历数组计数.

8210

数据结构】八排序之希尔排序算法

所谓基本有序,就是指小的关键字基本在前面,的关键字基本在后面,而不大不小的基本在中间....2个元素的数据保持有序,即将第一组数据"3,1,7,5,11,9,15,13"直接插入排序,将其调整为"1,3,5,7,9,11,13,15"的顺序,第二组同理: 然后我们就可以得到如下数组:...然后就是最后一步,我们将数组看作一组,让相邻的两个元素的数据保持有序,即将全组数据直接插入排序,就可以得到最终结果: 至此,其实我们对直接插入排序的优化过程,就是希尔排序算法的思路....它的基本思想是: 先选定一个整数,把待排序文件中所有数据分成gap个组,所有距离为gap的数据分在同一组内,并对每一组内的数据进行排序....重复上述分组和排序的工作,当达到gap=1时,所有数据在统一组内排好序.

8710
您找到你想要的搜索结果了吗?
是的
没有找到

数据结构】八排序之堆排序算法

一.堆排序简介及思路 堆排序(Heap Sort)是一种效率较高的选择排序算法. 它是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它通过堆来进行选择数据....有关堆还不了解的朋友可以先移步这篇文章:【数据结构】什么是堆? 它的基本思想是: 将待排序的序列构造成一个大堆....算法动图演示: 1.向下调整建堆 逻辑结构: 物理结构: 2.堆排序(升序) 逻辑结构: 物理结构: 二.堆排序的代码实现 算法实现步骤:(以升序为例) 从最后一个叶子结点的双亲节点开始向前遍历并向下调整建堆...建堆完成后,将堆顶元素与待排序列的最后一个元素做交换. 交换后缩小待排序列范围,使刚刚交换到最后的堆顶元素不再参与后续的堆排序. 重新将新堆顶元素向下调整,使堆恢复为大堆....堆排序方法对数据数较少的序列排序的效果并不很好,但对n较大的序列还是很有效的.

13710

数据结构】八排序之快速排序算法

它的基本思想是: 通过一趟排序将待排数据分割成独立的两部分 其中一部分数据的关键字均比另一部分数据的关键字小 可分别对这两部分数据继续进行排序,以达到整个序列有序的目的....算法动图演示: 二.快速排序代码实现的三种方式 我们了解了快速排序的基本思想是通过一趟排序将待排数据分割成独立的两部分之后,在代码的实现上,其实就有很多可以自由发挥的空间,如下较为主流的快速排序有三种实现思路..."快速排序的平均时间为 ,其中n为待排序序列中数据的个数,k为某个常数,经验证明,在所有同数量级的此类(先进的)排序算法中,快速排序的常数因子k最小.因此,就平均时间而言,快速排序是目前被认为最好的一种内部排序方法...通常,快速排序被认为是,在所有同数量级(O(nlogn))的排序算法中,其平均性能最好.但是,若初始数据序列按关键字有序或基本有序时,快速排序将蜕化为冒泡排序,其时间复杂度为O(n^2)."...//主要解决快速排序面对大量重复数据时效率低下的问题 //该部分内容待补

16821

数据结构】八排序之冒泡排序算法

个人主页:修修修也 所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.冒泡排序简介及思路 冒泡排序(Bubble Sort)是一种简单直观的交换排序算法。...算法动图演示如下: 二.冒泡排序的代码实现 算法实现步骤:(以升序为例) 比较相邻的元素。如果第一个比第二个,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。...有关更多排序相关知识可以移步: 【数据结构】八排序算法 http://t.csdnimg.cn/RXKYr 学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!...相关文章推荐 【数据结构】八排序之冒泡排序算法 【数据结构】八排序之希尔排序算法 【数据结构】八排序之直接插入排序算法 【数据结构】八排序之简单选择排序数据结构】八排序之堆排序算法...【数据结构】八排序之快速排序算法 【数据结构】八排序算法之归并排序算法 【数据结构】八排序之计数排序算法 数据结构排序算法篇思维导图:

38210

数据结构八排序

冒泡排序 简记 ? 前后两两对比 ? ? ? 选择排序 简记 ? 找出最小的放在前面 ? ? ? 快速排序 简记 ? 选择中间的元素作为”基准”。...插入排序 简记 ? 与前面排号序的比较,然后插入适合的位子 ? ? ? 基数排序 简记 ? 先从个位开始排序,再十位、百位。。。 ? ? ? 归并排序 简记 ?...希尔排序 简记 ? 将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。...同样的:从上面的描述中我们可以发现:希尔排序的总体实现应该由三个循环完成: 第一层循环:将gap依次折半,对序列进行分组,直到gap=1 第二、三层循环:也即直接插入排序所需要的两次循环。 ? ?...堆排序 主旨:左小右 ?

39920

数据结构】七排序算法

排序的分类 根据排序过程中借助的主要操作,内排序分为: 插入排序 交换排序 选择排序 归并排序 2.外排序排序是由于排序的记录个数太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据才能进行...对于这段代码,是最简单的冒泡,其实就是最简单的交换排序而已。它的思路就是让每一个关键字,都和它后面的每一个关键字比较,如果则交换,这样第一位置的关键字在第一次循环后一定变成最小值。...简单选择排序法的工作原理是:每一次从无序组的数据元素中选出最小(或最大)的一个元素,存放在无序组的起始位置,无序组元素减少,有序组元素增加,直到全部待排序数据元素排完。 ?...代码说明 简单选择排序相对简单,交换移动数据的次数相当少,节约时间。 简单选择排序的时间复杂度为O(n^2)。...快速排序的实现思路 选取一个关键字,放到一个位置,使得它的左边的值都比它小,右边的值都比它,这个关键字叫做枢轴(pivot) 然后分别对左边和右边进行排序。 快速排序的代码实现 ?

1.1K100

数据结构】八排序之简单选择排序算法

一.简单选择排序简介及思路 简单选择排序算法(Simple Selection Sort)是一种简单直观的选择排序算法....它的基本操作是: 每一次通过n-i次关键字间的比较,从n-i+1个数据中选出关键字最小()的数据,并和第i(1≤i≤n)个数据交换 重复n-1次上述操作,直到全部待排序数据元素排完....算法动图演示如下: 二.简单选择排序的代码实现 算法实现步骤:(以升序为例) 在元素集合arr[i]~arr[n-1]中选择关键码最小()的数据元素....tmp = *a; *a = *b; *b = tmp; } //选择排序(直接选择排序) void SelectSort(int* a, int n) { //优化:一趟选出最大和最小的...基于最终的排序时间是交换次数和比较次数的总和,因此,总的时间复杂度依然是O(n^2).

10110

基础排序算法(冒泡排序,选择排序,插入排序)

基础排序算法(冒泡,选择,插入) 一.冒泡排序法 原理解析: 时间复杂度: O(n²) 比较相邻的元素。如果第一个比第二个,就交换他们两个。...代码实现: 通过两层循环全套实现 外层循环:冒泡趟数 内层循环:冒泡次数 注意: 1 每多排好一个数据,可以将内层循环次数减少一次,从而提高效率. 2 总共只需要为n - 1个数据排序,剩下的一个是最小值...j = 0; j < i; j++) { // 比较大小 // 当前数据比后一个 if (arr[j] > arr[j + 1]) { // 交换 arr[j] =...原理解析: 时间复杂度: O(n^2) 首先在未排序序列中找到最小()元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小()元素,然后放到已排序序列的末尾。...代码实现: 两层循环嵌套,内层循环寻找最大值的下标 注意: 选择最大值的时候假定第一个数据是最大的 碰到比他的就更新下标 每次循环之前 最大值的下标要重置 #include int main() {

52330

MySQL字符集揭秘:排序规则决定你的数据如何排序

字符集和排序规则在数据库中的选择不仅关系到数据的存储和检索,还直接影响到数据的正确性和查询的效率。通过本文,你将更加深刻地理解MySQL字符集与排序规则之间的关系,并掌握如何正确应用它们。...它决定了可以使用哪些字符,但并没有规定它们的排序方式。 排序规则(Collation):排序规则决定了字符在数据库中的排序顺序以及比较行为。...排序规则的选择影响了数据库中文本数据排序和比较行为。具体来说,它决定了以下几个方面: 字符的大小写敏感性:有些排序规则区分字符的大小写,而其他规则不区分。这影响了文本的大小写比较结果。...所以它们被分开排序。 如何选择适当的字符集和排序规则 选择适当的字符集和排序规则取决于你的应用需求和数据类型。...选择适当的字符集和排序规则对于确保数据数据的正确性和查询性能至关重要。希望本文能帮助你更好地理解MySQL字符集与排序规则之间的关系,并在实际应用中正确选择和配置它们,以满足你的应用需求。

94920

主要排序方法总结:快速排序,选择排序,冒泡排序

本文介绍:三排序方法(快速排序,选择排序,冒泡排序)(后续期间可能会发布一篇关于qsort函数的文章) 自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解...int sz) { int l=0, r=sz-1; //l:左下标,r:右下标 while (l < r) { int max=r, min=l; /*必须得放入循环内,因为进行完一次排序后要更新下一次排序后最大最小值的位置...= t; }*/ l++; r--; /*更新左下标和右下标*/ } } //10 //9 8 7 6 5 4 3 2 1 0 //5 32 29 66 91 82 //测试数据...通过相邻两数的比较,将的数逐渐移至数组较后的位置,最后将最大的元素冒泡至最后 理解动图:https://img-blog.csdnimg.cn/2020062712431452.gif //冒泡排序...通过相邻两数的比较,将的数逐渐移至数组较后的位置,最后将最大的元素冒泡至最后 /*若有n个元素,则一共会进行n-1次排序,每次会把最大的推到最后,在推到最后的过程中 会进行n-1-i次操作*/ /*

9110

排序之冒泡排序

冒泡排序作为十排序之一,是一种简单且稳定的排序算法 算法思想可以联想为向湖中下石头和较轻的石头变成泡泡上浮的过程 想象每一块石头处在相应的高度,从上往下相邻两个石头进行比较,较大的石头往下沉,替代下一石头的位置...; /** * Java十排序之冒泡排序(未优化版) * @author com * */ public class Sorts { public static void main(String...]; A[j+1] = temp; } } } return A; } } 运行结果: [0, 2, 9, 10, 16, 24, 26, 49, 100] 原数据..., 24, 26, 49, 100] [0, 2, 9, 10, 16, 24, 26, 49, 100] 优化版: import java.util.Arrays; /** * Java十排序之冒泡排序...运行结果: [0, 2, 9, 10, 16, 24, 26, 49, 100] 原数据: [49, 26, 2, 9, 16, 0, 10, 100, 24] 第 1 趟排序: [26,

21530

DS:八排序之堆排序、冒泡排序、快速排序

,然后都找到后就交换两边的值,重复上述过程,最后当两个指针相遇的时候,再将相遇点的值与key点的值交换,此时key的左边都是比key小的值,key的右边都是比key的值,这样就完成了一次选基准值的排序...,大家会发现此时恰好key的左边是比key小的,key的右边都是比key的,其实这并不是巧合,我们后面会分析,这边我们先实现一下一次基准排序的代码!...GetMidIndex(a, left, right); Swap(&a[mid], &a[left]); 你可能觉得这样子应该能过了 ,那我们再测试一下—— 结果你发现,又被针对了,有序的情况解决了,又面临着有大量重复数据排序问题...3.7 非递归法快排实现 3.7.1 栈实现 我们发现无论是hoare、挖坑还是前后指针,本质区别就是基准排序方法不同,但最后还是用递归去解决的,递归虽好但是有些时候如果数据太大的话还是有可能造成栈空间不够的情况...StackEmpty(&st)) { //将数据弹出来进行进准计算 int left = StackTop(&st); StackPop(&st); int right= StackTop

13110

数据结构】八排序算法详解

内部排序数据元素全部放在内存中的排序。 外部排序数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据排序。...:直接选择排序 5.1 基本思想 每一次从待排序数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序数据元素排完 。...:堆排序 6.1 基本思想 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。...key的 7.1.3.2 代码示例 我们写一个挖坑法的函数来排keyi左右的数据 先用三数取中方法得到keyi,定义一个key保存keyi的值,定义一个坑位holei先放到begin 右边找小,填到左边的坑里...,遍历一遍数组 同样,他也有局限性: 不适合分散的数据,更适合集中的数据 不适合浮点数、字符串、结构体数据排序,只适合整数 9.3 实现代码 先求最大值max和最小值min,然后遍历原数组统计次数,最后排序

8610

数据结构】八经典排序(两万字总结)

else { break; } } a[end + gap] = tmp; } } } 注意事项 1、关于 gap 的取值:我们知道,gap 越大,数据就能越快的到后面去...,小的数据能越快的到前面来,但数据的有序性较低;gap 越小,数据到后面和小的数据到前面和后面的速度较慢,但是数据的有序性就越高;所以综合二者考虑,为了提高效率,大佬Knuth提出了 gap 随数据个数和排序次数变化的思路...;其次,对于优化后的快排来说,三数取中只能保证我们每次选出的 key 值不是最小或者次小的数,那么这里就存在一种可能 – 我们每次选出的 key 为倒数第三、第四小的,在这种情况下如果我们的数据量非常...: 只能排序整形数据,不能排序浮点数、字符串等其他类型的数据; 只使用与数据分布范围较小的情景,当数据分布较分散时,空间消耗太大; 8.4 特性总结 计数排序数据范围集中时,效率很高,但是适用范围及场景有限...MergeSort:%d\n", end6 - begin6); free(a1); free(a2); free(a3); free(a4); free(a5); free(a6); } 八排序完整项目代码

56100

排序(一)冒泡排序,选择排序,插入排序,希尔排序

一.冒泡排序 (1)原理: 冒泡排序的原理是:重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从到小、首字母从Z到A)错误就把他们交换过来。...a+j+ 1); tmp = 1; } } if (tmp == 0) { break; } } } (3)时间复杂度与算法稳定性 时间复杂度 算法稳定性 冒泡排序就是把小的元素往前调或者把的元素往后调...二.选择排序 (1)原理: 选择排序原理如下:第一次从待排序数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小()元素,然后放到已排序的序列的末尾。...以此类推,直到全部待排序数据元素的个数为零。...,排序后这些数据的相对次序保持不变,即它们的位置保持不变,通俗地讲,就是两个相同的数的相对顺序不会发生改变,则该算法是稳定的;如果排序后,数据的相对次序发生了变化,则该算法是不稳定的。

10210

数据结构》八排序算法 必读!

版权声明:版权所有,未经许可,不得转载,转载或者引用本文内容请注明来源及原作者 前言 本文将介绍常见八排序,包括直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序以及计数排序(计数排序和桶排序面试基本不涉及...cur还没遇到比key数据之前,prev紧跟着cur,cur遇到比key的值以后,prev和cur之间间隔着一段比key数据。...06 八排序对比 6.1 八排序的性能测试评估 // 测试排序的性能对比 void TestOP() { srand(time(0)); const int N = 10000; int* a1 =...希尔排序:在预排序时,相同的数据可能在不同的组里面,没办法控制,所以不稳定。...6.3 八排序时间/空间复杂度一览 ----

60130

排序(二)堆排序,快速排序,归并排序,计数排序

只要将需要排序的数组建立成堆,然后每次取出根结点,就把剩下的结点调整成堆;再取出根结点,如此下去,最后便能得到排好序的数据。...空间复杂度 空间复杂度: 因为堆排序是就地排序,空间复杂度为常数:O(1) 算法稳定性 稳定性:不稳定。...二.快速排序 (1)原理 快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素...(2)不同版本快速排序 快速排序的主框架为: // 假设按照升序对array数组中[left, right)区间中的元素进行排序 void QuickSort(int array[], int left...: 将区间按照基准值划分为左右两半部分的常见方式有: 1.hoare版本 hoare版本主体代码为: int GetMidi(int* a, int left, int right)//避免大量重复数据带来的负面影响

7910

排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

插入排序适用于 already sorted 或几乎已经排序数据。2.希尔排序 希尔排序通过交换不相邻元素来实现排序,其目的是让数组中任意间隔为h的元素都是有序的。此时数组的性能接近O(n)。...选择排序的优点在于数据移动是最少的,但是如果数据量较大,排序速度较慢。4.冒泡排序冒泡排序的思路是比较相邻的元素,如果顺序错误就把元素交换过来。...冒泡排序不是很高效,但简单易理解,可以在非常短时间内完成排序。5.堆排序排序使用二叉堆数据结构来实现。...2)分割:所有比基准值小的元素挪到基准前面,所有比基准值的元素挪到基准后面。3)递归地对基准值前后的两个子数组进行快速排序,直到数组已经完全排序。...快速排序最重要的是partition()这个步骤,它可以确保主元左边的值都比主元小,主元右边的值都比主元

23020
领券