数据结构
文章平均质量分 69
记录学习数据结构时的思路,方便自己以后回顾
仲夏夜之梦~
这个作者很懒,什么都没留下…
展开
-
双向链表的实现
双向链表的实现原创 2022-11-22 13:40:49 · 393 阅读 · 0 评论 -
哈希表实现原理
Hash表实现原理原创 2022-11-20 19:41:28 · 1094 阅读 · 0 评论 -
归并排序(一)——递归排序
归并的思想和前面说的快排比较类似,快排是先通过单趟排序,产生一个分界点,然后分界点的两侧重新开始单趟排序归并是直接将以数组的中心位置作为分界点,不断取中间位置,分成两个小区间,直到无法分解核心思路:先分解左半部分,然后排序再分解右半部分,然后排序一、排序说明(一开始可跳过,后面涉及排序再看)假设现在有两个数组(1)新建一个临时数组tmp(2)arr1 和 arr2 都从begin1 和 begin2开始比较 4 和 3 比较,先将 3 放入临...原创 2022-03-16 11:01:44 · 5136 阅读 · 0 评论 -
快速排序(四)—— 非递归排序
前面实现了快排的递归实现,并对其进行优化但是递归需要在栈上为函数开辟空间,32位下,栈可使用的内存大小不超过2G,如果递归较深,依然可能会发生栈溢出这个时候递归排序就不大适用,所以需要非递归出场...原创 2022-03-13 10:56:42 · 4864 阅读 · 0 评论 -
快速排序(一)——单趟排序
快速排序的单趟排序有三种,分别是hoare法、挖坑法、双指针法个人比较喜欢最后一种的双指针法所以下面的单趟排序将使用双指针法实现一、基本思路1、设置指针位置cur:寻找比key小的数,找到比key小的数,和prev的下一位交换——丢到左边prev:是左右区间的临时分界点,prev(右边)紧跟比key大的数key:哨兵位或最终分界点,不参与比较,最后cur检索完毕时,和prev的下一位交换第一种方式:key在最左边以最左边的值作为key,由于key不参与比较原创 2022-03-11 12:50:13 · 2421 阅读 · 0 评论 -
快速排序(二)——递归排序
前面已经实现了单趟排序,下面将通过递归进行第二趟、第三趟排序...来让数组有序但同时也需要作一定的优化优化的原因如下:1、对于key值的选取,仅以最左边作为key值,可能会导致栈溢出2、递归的时候,如果区间长度小于10(10 只是一个参考值),使用快排的效率不高一、基本思路测试数组是我们上次单趟排序的结果在单趟排序之后,会分为左右两个区间,左右两个区间再分别进行单趟排序直到分解只剩两个数二、递归排序代码实现1、单趟排序代码下面贴上前面写的单趟排序的代码原创 2022-03-11 16:12:20 · 4588 阅读 · 0 评论 -
快速排序(三)——排序优化
之前通过递归实现了 最终排序,但依然需要优化优化的原因如下:1、对于key值的选取,仅以最左边作为key值,可能会导致栈溢出2、递归的时候,如果区间长度小于10(10 只是一个参考值),使用快排的效率不高优化一:避免key出现在边界这里使用的方法是三数取中法三数:最左边的数、数组中间位置的数、最右边的数比较三个数的大小,取中位数作为keyint GetMid(int* a, int left, int right){ int mid = (left + right)原创 2022-03-11 20:17:58 · 1200 阅读 · 0 评论 -
选择排序(一)——直接插入排序
1、基本思想(1)想象 3的前面是一个空的有序数组(2)先将3 放入这个有序数组,然后从第2个元素开始,逐个和有序数组中的元素 排序横向:插入新的元素后,有序数组的自我调整纵向:有序数组调整完毕,有序数组多一位成员(3)直到end到达第 size-1 位size:数组元素的个数2、代码实现(1)单次有序数组的调整过程假设 以end = 2的调整为例 int end = 2; int val = a[end + 1...原创 2022-03-10 11:33:51 · 248 阅读 · 0 评论 -
选择排序(二)——希尔排序
1、希尔排序基本思路:之前的一篇博客中,介绍了直接插入排序的实现,希尔排序实际上是在直接插入排序的基础上优化当一组数据,越接近有序,那么他需要调整(移动)的次数就越少(往极端的方向想,如果一组数据是有序的,那么根本就无需排序)||\ || /V希尔排序的思路:(1)先通过分组预排序,让一组数据接近有序(2)再通过直接插入排序,将这组数...原创 2022-03-10 12:59:36 · 510 阅读 · 0 评论 -
堆排序(一)——建小堆(含向下调整代码)
在不额外开辟空间的情况下,通过向下调整来建一个小堆原创 2022-03-05 11:36:41 · 2496 阅读 · 3 评论 -
堆排序(二)——排序
在建好的小堆上进行向下调整原创 2022-03-05 14:12:26 · 689 阅读 · 0 评论 -
TopK问题
一、提出问题假设现在有N个数,我们需要选出N个数中前 K 个较大的数二、思路分析1、先从N个数中取出K个数,构成一个数组arr2、将数组arr构建成一个小堆(堆顶是最小的数)3、然后从剩下的 N-K 个数中逐个取出 数,和堆顶的数比较-如果比堆顶的数更大,则替换堆顶的数,然后向下调整(最小的数被删除了,选出次小的数)-如果比堆顶的数更小,则保持不变4、重复第三步,直到剩下的 N-K个数都参与了比较整体思路就是 如果比堆顶的数更大,则替换堆...原创 2022-03-05 21:37:13 · 111 阅读 · 0 评论