常用排序算法
文章平均质量分 74
算法是程序的灵魂,不会算法的程序员不是一个好的程序员。本专栏将逐一为大家将解一些常用的算法。
小猿桥
人当努力,上进,却又时而慵懒,时而勤快。用知识和情调填满生活的每一分每一秒。
展开
-
【十大排序算法】超硬核,确定不进来看看?
文章目录一、十大排序算法汇总二、插入排序三、希尔排序四、选择排序五、堆排序六、冒泡排序七、快速排序八、归并排序九、桶排序十、计数排序十一、基数排序一、十大排序算法汇总分类时空复杂度二、插入排序💉把待排序的记录按照其关键码值插入到已经有序的序列列中,循环反复,直到所有的记录全部插入完毕,得到一.原创 2022-04-27 16:46:16 · 849 阅读 · 4 评论 -
基数排序(桶排序)——C语言实现
文章目录一、基数排序二、排序思想三、动图演示四、图解五、代码实现(包含详细注释)六、问题解答七、致命缺陷(负数问题)一、基数排序基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,在某些时候,基数排序法的效率高于其它的稳定性排序法。二、排序思想基数排序就是桶排序,也可以说是桶排..原创 2022-04-19 12:47:03 · 9019 阅读 · 19 评论 -
归并排序(非递归)——C语言实现
一、递归实现归并排序的问题递归实现快速排序一样,递归实现归并排序一样需要在栈上建立栈帧,消耗栈空间,当提柜深度过深时,就会出现栈溢出的现象。为了解决这个缺陷,本文将带来非递归实现归并排序的算法。二、利用循环实现归并排序2.1 思想我们利用一个新的数组,先两两归并,...原创 2022-04-15 11:42:27 · 2157 阅读 · 17 评论 -
快速排序(非递归)——C语言实现
一、递归算法快速排序分析在快速排序这篇文章中——>【快速排序点击这里】已经提到并分析了,递归会建立函数栈帧,递归的深度越深,占用栈区的空间就越大,栈区的大小一般是8M,10M。当深度足够深时,栈区的空间就会被用完,导致栈溢出,即便是加了小区间优化,依然会存在栈溢出的缺陷,所以我们必须寻求一种稳妥的方法,这种方法就是非递归实现。二、非递归算法实现快速排序2.1 需求分析我们采用递归算法来实现快速排序时,我们递归的到底是什么?很简单,我们通过递归,就是再次调用该函数的功能,也就是单趟排序。那么我们原创 2022-04-12 11:32:56 · 5038 阅读 · 13 评论 -
归并排序(递归)——C语言实现
文章目录一、归并排序定义二、图解归并过程三、动图展示四、分治递归五、归并排序代码一、归并排序定义归并排序:是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二、图解归并过程归并的思想就是,对于左右子区间都有序的序列,我们可以借助一个临时数组进行归并。定义两个指针begin1和begin2,分别原创 2022-04-11 12:15:12 · 8743 阅读 · 14 评论 -
快速排序(递归)——C语言实现
一、快速排序快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。二、快速排序之“挖坑法”挖坑法思路:单趟排序:单趟排序的目的就是使当前的key值放到它最终的位置,左边全是比它小的数,右边全是比它大的数。我们一般选取第一个值或者最后一个值做key值,最开始pivot就原创 2022-04-08 10:44:32 · 5647 阅读 · 44 评论 -
计数排序——C语言实现
一、计数排序计数排序:是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 当然这是一种牺牲空间换取时间的做法。二、计数排序思路我们以以下的序列为例:在对以上序列排序前,我们先建立一个新的数组,...原创 2022-03-30 13:29:52 · 7622 阅读 · 10 评论 -
冒泡排序——C语言实现
一、冒泡排序的定义冒泡排序(Bubble Sort):是常用排序算法中比较简单的一种。其基本思路是将待排序的序列从头遍历到尾,遍历n趟(n为序列元素个数)。每一趟依次比较相邻的两个数,如果顺序错误就交换,然后继续往后遍历,这样一趟下来,最大(最小)的数就被冒到了序列尾部。二、图解三、冒泡排序的特点1、冒泡排序原理及其简单,容易理解;2、时间复杂度:O(N^2);3、空间复杂度:O(1);4、稳定性:稳定。四、代码实现#include<stdio.h>//冒泡排序,交原创 2022-03-23 21:55:14 · 1610 阅读 · 5 评论 -
直接选择排序——C语言实现
上期我们讲了堆排序,堆排序是选择排序的一种,本期我们讲述一下直接选择排序,按道理应该是先讲直接选择排序的。直接选择排序效率极低,只是了解一下,实际不推荐使用。一、直接选择排序思想:直接选择排序就是遍历整个数组,每遍历一遍的目的是找出该数组中的最大数和最小数对应的下标,然后将最小数和数组的第一个数进行交换,最大数和数组的最后一个数进行交换,然后缩小范围再次遍历。(已排好的最大数和最小数不再参与后续的遍历)图解分析:...原创 2022-03-21 19:47:14 · 4102 阅读 · 5 评论 -
直接插入排序——C语言实现
一、直接插入排序基本思想:把待排序的记录按照其关键码值插入到已经有序的序列列中,循环反复,直到所有的记录全部插入完毕,得到一个新的序列,该序列就是有序序列。二、图解思想:看上图:第1步:我们把5当成一个有序序列,对2进行排序,2比5小,将5移到2的位置,然后将2放到5的位置;第2步:2和5当成有序序列,对4进行排序,4比5小,将5放到4的位置,4比2大,将4放到5的位置;第3步:我们把2和4和5当成有序序列,对6进行排序,6大于五,不动;第4步:我们把2、4、5、6当成一个有序序列原创 2022-02-14 15:40:44 · 1302 阅读 · 7 评论 -
希尔排序——C语言实现
一、希尔排序思想:希尔排序本质上也是直接插入排序,但是会先进行预排序,使原序列更接近有序序列,最后将预排之后的序列进行直接插入排序。二、思路详解:大家看这个序列:arr1[] = {9,8,7,6,5,4,3,2,1,0},如果用直接插入排序,那么需要往后移动元素的次数为n*(n-1)/2,也就是45次;但如果是这个序列呢:arr2[] = {0,1,2,3,5,4,8,7,6,9};,用直接插入排序,需要移动元素的次数仅为4次。由此可见,对于一个已经比较有序的序列,原创 2022-02-15 17:17:21 · 7499 阅读 · 10 评论 -
堆排序——C语言实现
在实现堆排序之前,我们先讲解一些必备的知识点。一、什么是堆?堆的逻辑结构是完全二叉树; 堆的物理结构是一个数组。二、堆的分类:大堆:所有的父亲大于等于孩子;小堆:所有的父亲小于等于孩子。三、父亲和孩子的下标关系:leftchild=parent×2+1;rightchild=parent×2+2;parent=(child-1)/2。四、堆能干什么?大堆能保证堆顶的数最大; 小堆能保证堆顶的数最小; 堆排序也正是利用这一特性进行排序的。原创 2022-03-08 21:17:39 · 16042 阅读 · 21 评论