![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
排序
文章平均质量分 66
Gay~
Those times you get up early you work hard,Those times you stay up late and you word hard,Those times when you don't feel like working,you too tired,you don't want to push yourself,but you do it anyway,That is actually the dream,That's the dream,it's not the destnation,it's the journey.
展开
-
各大“排序”特性及稳定性总结
稳定性如何定义:排序算法的稳定性并不是指它在对数组进行排序的时候的时间复杂度是否变化,而是对于相同数值的数据进行排序了之后它们的相对位置是否发生了变化,比如说在考试的时候,小明先交卷,小强后交卷,但是他们改出来的成绩是相同的,因为小明先交卷,改出来的成绩数据肯定放在前面,小强后交卷,改出来的成绩数据肯定放在后面,所以排完序之后要求小明的成绩依然在前面,这叫做排序算法的稳定性。原创 2023-04-30 17:01:32 · 613 阅读 · 6 评论 -
快速排序4(三路划分快排)
三路划分快排的思路:三路划分,顾名思义就是把数组分成三个部分进行排序,选定一个key,把数组分成小于key的,等于key的,还有大于key的。如果a[cur]==key,那就++cur,这样循环往复,知道cur>right就结束,最后得到的a[begin,left-1]是比key小的数,a[left,right]是等于key的数,a[cur,end]是大于key的数,划分成三路之后,中间这一路就不用再进行排序了,因为中间这一路都是等于key的,所以已经有序了,只需要对左路和右路再进行递归排序即可。原创 2023-04-30 14:35:02 · 303 阅读 · 3 评论 -
“计数”排序
计数排序,是通过统计每一个数字出现的次数,并把它映射到与它自己本身数值相同的下标处,再遍历映射的数组使原数组有序的一种排序方法,计数排序的本质是一种哈希算法,也就是通过建立映射关系来达到排序的目的。原创 2023-04-14 19:50:18 · 2852 阅读 · 4 评论 -
归并排序(递归+非递归)
归并排序(递归)的基本思路:递归的思路很简单,就是把整个大数组用二分法逐步划分成小数组,直到数组只有一个数或者没有数的时候开始往回归并,归并就是用两个有序的数组遍历比较,哪个数小就把它归并到开辟的临时数组中去,这样就能把两个有序的数组归并成一个有序的数组,那归并得到的这个有序的数组再和另外一个有序的数组归并,以此类推,则最后一次就是把左右两半有序的数组进行归并从而使整个数组有序。原创 2023-04-14 16:55:37 · 1206 阅读 · 2 评论 -
快速排序(非递归)
大概思路是:刚开始时,先把数组的左右下标入栈,然后开始取栈内的数据作为排序子数组的区间值,那么每走一趟快排都会返回一个keyi,如果keyi-1比begin大,那证明这个区间里面至少还有两个值,那就把begin和keyi-1入栈,否则就证明只有一个值或者没有值了,不需要入栈;如果keyi+1小于end,那就把这keyi+1和end入栈,否则不入,等到下一次循环的时候就在栈中取出两个数,这两个数就是需要排序的子区间,进行排序,以此类推,直到最后栈中没有了数就证明数组已经排完了。原创 2023-04-12 00:53:59 · 157 阅读 · 5 评论 -
快速排序3(前后指针法)
前后指针法,顾名思义,就是通过控制两个指针来达到排序的目的的方法。具体思路:先选定左边第一个为基准值key,同时设定left位置为prev,prev的后一个位置为cur,从a[cur]开始和key比较,如果a[cur]比key小,就先将prev++,再让a[cur]和a[prev]交换,然后cur++,如果a[cur]比key大,那么就不改变prev,也不用交换,只对cur++,以此类推,直到cur>right就结束,最后将a[prev]和a[cur]交换就完成了一趟快排。原创 2023-04-10 00:00:41 · 409 阅读 · 6 评论 -
快速排序2(挖坑法)
挖坑法的思想是:先保存最左边的left位置的key值,然后最左边的left位置就可以看作是一个“坑”,因为它可以被其他数据覆盖(key已经被保存起来,所以不用担心原来的数据被覆盖掉),然后先从右边right位置开始往左找比key小的数,找到后把这个值填到“坑”里面,那么这个位置就会变成一个新的“坑”,再从左边left位置开始往右找比key大的数,找到后又把它填到“坑”里面,再从右向左找比key小的,以此类推,最后它们一定会在坑里相遇,因为left和right肯定有一个为“坑”,最后把保存的key值填到坑里。原创 2023-04-06 00:22:26 · 248 阅读 · 5 评论 -
快速排序1(hoare版本)
hoare版本的快速排序,选左边做key(基准值),必须要让右边先走,这样才能保证相遇位置的左边的数比key小,右边的数比key大。原创 2023-04-05 16:56:44 · 658 阅读 · 2 评论 -
“选择”排序
何为选择排序?其实选择排序是最好理解的排序,就是每次遍历数组,从中选出一个最大的和一个最小的数,把最小的数放到数组的最左边,最大的数放到数组的最右边,两边缩小一个位置(因为最大和最小的数已经排好了),再遍历剩下的数找出最小的和最大的数放到第二个位置和倒数第二个位置,以此类推,最终就能使数组有序。原创 2023-04-05 12:27:19 · 97 阅读 · 4 评论 -
“冒泡”排序
学习C语言,最基本的技能之一就是排序,而排序里面最常用的方法就无疑是冒泡排序了。顾名思义冒泡就是像泡泡一样一个一个地从水底冒出来,所以冒泡排序就是像水里。面的泡泡一样一个一个地排好序地冒出来。原创 2022-11-08 20:56:10 · 280 阅读 · 3 评论 -
“希尔”排序
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数gap,把待排序文件中所有元素分成gap组,即所有距离为gap的分在同一组内,并对每一组内的元素进行直接插入排序(本质是进行预排序,使数组更接近有序,目的是使最后一次直接插入排序提高效率)。然后取gap=gap/2或者gap=gap/3+1重复上述分组和排序的工作。当gap到达1时,数组是已经接近有序的,而对于直接插入排序在顺序有序或者接近顺序有序的数组内的时间复杂度为O(N),效率极高。原创 2023-04-04 22:13:02 · 6089 阅读 · 6 评论 -
C语言模拟实现qsort(用冒泡排序的排序方式模拟实现一个通用的排序函数)
可以看到,上图中的qsort函数的返回类型是void,有4个参数,第一个参数是待排序的数组的起始地址,第二个参数是数组中元素的数目,第三个参数是数组中每个元素的大小(单位是字节),第四个参数是一个函数指针,由图可知,参数是两个void*类型的指针,今天的分享就到这里,喜欢的小伙伴们可以点一下小红心支持一下,评论区说出你们不同的想法。学过C语言的都知道,排序是最基本的操作,而排序的方法又有很多种,直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序等等。原创 2022-11-20 16:24:51 · 501 阅读 · 21 评论 -
直接插入排序
(升序)实现的思路就是:给定一个数组,我们认为第一个数就是有序的,然后从第二个数开始往前进行插入排序,往前插入排序的过程就是比较和挪动数据的过程,先保存需要插入的这个数,防止挪动数的时候被覆盖,然后用这个需要插入的数逐一和它前面的数进行比较,如果比前一个数小,就把前一个数往后挪动一位,腾出空间,再和前一个数的前一个进行比较,以此类推,直到找到待插入的数比前一个数大或者相等就停止,那么找到的这个位置的下一个位置就是待插入数据的位置,然后就插入即可。这样的排序我们就叫做插入排序。原创 2023-04-03 13:08:21 · 280 阅读 · 3 评论 -
“堆”排序
你试想一下,如果建小堆,也就意味着你的堆顶的数就是最小的,这个数就不用再动了,但是如果后面的数你需要选出次小的数放到第二个位置,那么你就需要忽略第一个数,以第二个数开始的后面的所有数看作是一个堆,然后调整找到次小的数放到第二个位置,但是以第二个数看作是堆顶的话,那么从第二个数开始的后面的数就不再是一个小堆了,那要选次小的数的话就需要重新建一个小堆,那代价太大了,还不如遍历一遍找到最小的数呢!效率极高的哦,你学会了吗?这里建大堆用向下调整的方法为妙,向下调整建堆的方法请参考博主的数据结构专栏的 二叉树(堆)原创 2023-03-27 23:30:04 · 290 阅读 · 4 评论