数据结构与算法
文章平均质量分 57
十分之九加九分之一
互相学习,洒洒水啦
展开
-
堆排序【带图演示】
一、前提知识预备在了解堆排序前,补充一下堆的知识吧,它的结构可以分为大根堆和小根堆,是一颗完全二叉树大根堆和小根堆每个节点的值都大于等于其左右节点的值称为大根堆,那小于等于就称为小根堆。如下图:既然是个完全二叉树,节点之间有规则可言,假如已知节点的下标为 i,那么:父节点的下标为:( i - 1 ) / 2左孩子的下标为: i * 2 + 1右孩子的下标为:i * 2 + 2所以当一个数组要排序的时候,需要建立一个堆,并满足以下性质:大根堆:arr[ i ] >= ar原创 2021-11-15 15:32:34 · 2320 阅读 · 0 评论 -
快速排序(萝卜填坑算法)【必会知识】
快速排序 话说叫快排快排,但是在某种某件下会变成慢排,好了好了,进入正文快排也是采用了一种分治的策略,该方法的基本思想是:1、先找一个基数,我一般用第一个数2、然后把比基数小的方左边,比基数大的方右边,然后以基数下边为分界线,划分左右区间3、然后左右区间进行重复的操作4、最后会得到 n 个有序的区间直接举例子吧现在有一个无序的数组 arr ????我们现在取第一个元素为基数 也就是 pivot=arr[0] = 77,left 下标为 0 ,right下标为 7 ,现在原创 2021-11-12 18:00:14 · 818 阅读 · 0 评论 -
归并排序(MergeSort)
归并排序概念归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的。利用归并的思想实现排序,该方法采用经典的分治策略,分成一些小的问题然后递归求解, 而治的阶段则将分的阶段得到各答案"修补"在一起即分而治之。算法原理这个地方不太好用文字描述,直接举个小栗子吧1、这里有一组无序数组2、总体流程我大致说一下我的理解红色部分按 n / 2 进行递归分原创 2021-11-11 17:50:29 · 1366 阅读 · 0 评论 -
插入排序【必会知识】之优化(希尔排序)
插入排序插入排序也是一种常见的排序算法,插入排序的思想是:将数据分为有序部分和无序部分,每一步将一个无序部分的数据插入到前面已经排好序的有序部分中,直到插完所有元素为止。时间复杂度:O(n^2)稳定性:稳定直接上动态图:代码演示/** * 插入排序 10W 条数据 平均花费 1 S */public class InsertSort { public static void insertSort(int[] arr) { //为空或者长度小于2直接返回原创 2021-11-10 17:28:58 · 771 阅读 · 0 评论 -
选择排序【必会知识】
选择排序顾名思义,选择,选择,就是靠选择来排序,那是个什么选择法呢?之前的冒泡排序是在一趟中可能交换多次数据,但是在选择排序中,在一趟跑完后,会在未排序的数据中选择一个最大(小)值的下标,然后再进行一次交换。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素(一般就是第一个元素),存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置,直到未排序元素个数为0即可。稳定性:在选择排序中,每趟都会选出最大元素或最小元素,然后与两端元素交换,此时,待排原创 2021-11-10 10:52:59 · 316 阅读 · 0 评论 -
冒泡排序【必会知识】
冒泡排序冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大(小)的数下沉,较小(大)的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。时间复杂度平均是O(n^2),空间复杂度为 O(1)步骤也比较固定:1、比较相邻的元素。如果第一个比第二个大(小),就交换它们两个;2、在每一趟中,对于相邻的两个元素做着重复的操作,从第一对比较到最后一对,这样,总有一个最大(小)值在末尾;3、执行完步骤2后,最后一个元素是最大(小)的,下一趟不原创 2021-11-10 09:19:52 · 991 阅读 · 1 评论