
数据结构
weixin_42873905
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
BST树
BST树:二叉排序树首先是树的基础架构,我采用的是三叉链表,即leftchild,parent,data,rightchild.构造链表:typedef struct BstNode{ ElemType data; BstNode *leftchild; BstNode *rightchild; BstNode *parent;}BstNode;typedef struct{ BstNode *head; int cursize;}BSTree;然后就是对其进行初始化和购买原创 2020-06-28 16:38:14 · 168 阅读 · 0 评论 -
LRU最久未用算法的设计
要求:获取数据get(key):如果关键字存在缓存中,则获取关键字的值(总是正数),否则返回-1.写入数据put(key,value):如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组。当缓存容量达到上限的时候,他应该在写入新的数据之前,删除最久未使用的数据,从而为新来的数据腾出空间。进阶:在O(1)的时间复杂度内完成这两种操作。LRUCache cache = new LRUCache(2) /2:缓存容量/测试用例:设计思想:因为时间复杂度为O(1),所以我想到了STL组原创 2020-07-26 15:20:30 · 114 阅读 · 0 评论 -
组合问题--排列数
题目:[1,2,3] [4,5] 进行组合(1,4)(1,5)(2,4)(2,5)(3,4)(3,5)思想就是排列树的思想void Perm(vector<vector<int>> &arr,int k,vector<int> &tmp){ if(k == arr.size()) { int n = tmp.size(); for(int i = 0;i < n;++i) { cout << tmp[i]原创 2020-07-27 12:17:56 · 120 阅读 · 0 评论 -
单链表排序
使用归并排序实现:(核心就是链表合并的函数实现)class Solution {public: ListNode* sortList(ListNode* head) { if (head == nullptr) { return head; } int length = 0; ListNode* node = head; while (node != nullptr) {原创 2020-12-06 17:00:30 · 94 阅读 · 0 评论 -
树的三种遍历方式
1.中序遍历思路:每到一个节点 A,因为根的访问在中间,将 A 入栈。然后遍历左子树,接着访问 A,最后遍历右子树。#include <iostream>#include <vector>#include <stack>struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullp原创 2020-10-25 17:00:38 · 236 阅读 · 0 评论 -
基数排序
1.意识中准备十个桶,分别标识0-9。2.先根据数字的个位分别将数字放到相应的桶中,然后根据桶的顺序将数字再进行移出。51 33 534 26 7 27 67 7648 649 493.在根据十位放到相应的桶中,随后再取出。4.随后进行下一位,直到位数最多的结束。int GetNum(int *arr,int len)//获取最大的数字有多少位{ int max = -1; int i = 0; int count = 0; for(i;i<len;i++) { if(ar原创 2020-05-14 13:40:46 · 135 阅读 · 0 评论 -
归并排序
归并排序的思想:在中线分开,一直分,直到每一组只剩下一个元素。 随后再按照之前的分开顺序逆推,逐渐的使每一个小组趋于有序。void Merge(inr *arr,int *tmp,int start,int mid,int end)//合{ int i = start; int j = mid +1; int k = start; while(i < mid+ 1 && j < end + 1) { if(arr[i] <= arr[j]) {原创 2020-05-14 12:27:05 · 126 阅读 · 0 评论 -
快速排序
1.选择基准点,比基准点小的数放在左边,否则放在右边。(一般都是 选择第一个元素作为基准点,可以让零号下标空出位置作为移动的空间)2.从尾部开始判断和基准点的数值进行比较。在这里遵循一个规则:数值往左移动,那么下一步比较就会往右移动进行比较。数值往右移动,那么下一步比较就会往左移动进行比较。3.循环1和2的过程,一直到最后每一组只剩下一个元素,就自然的有顺序了。4.小组的起始位置:startindex小组的末尾位置:endindexstartindex > endindex:没有元素st原创 2020-05-11 18:29:02 · 150 阅读 · 0 评论 -
堆排序--选择排序
堆:符合完全二叉树思想:大顶堆、小顶堆每一次根节点位置的元素都是最大的(大顶堆),然后和待排序的最后一个节点进行交换,然后重新调整大顶堆,重复此过程。(假如由十个元素,那么第一个回合就是0-9,第二回合0-8…)形成大顶堆的时候,是从后向前调整的。最后一个父亲节点的位置:i = (len-1-1)/2左孩子:j = 2i + 1;右孩子:2n + 2;判断是否有右孩子:j < 2i + 1;说明有右孩子j = 2i + 1;说明没有右孩子void StackAdjust(int *a原创 2020-05-09 22:03:51 · 153 阅读 · 0 评论 -
交换排序--冒泡排序
冒泡:让大的数浮到最后。需要两个标记 i 和 j ,标记的都是第一个元素。需要注意的是:j < len-1-i;因为每次都要出去已经排序好的最大的元素void Bubble(int *arr,int len){ int i; int j; int tmp; for(i = 0;i < len-1;i++) { for(j = 0;j < len-i-1;j...原创 2020-05-03 09:46:55 · 122 阅读 · 0 评论 -
选择排序--简单选择排序
选择排序:每次选择最小的元素放到相应的位置简单选择排序:1.已排序部分 2.待排序部分(和直接插入排序不同,这里的所有元素都是待排序部分)此排序一共有三个标记,待排序部分第一个元素下标i,待排序部分第二个元素下标j,记录待排序中的最小的元素下标min。通过筛选出待排序中的最小的元素,赋值给arr[min]void SimpleSelectSort(int *arr,int len){...原创 2020-05-01 22:57:52 · 133 阅读 · 0 评论 -
插入排序--希尔排序(基于简单插入排序的优化)
思想:使数据慢慢的趋于有序(分组)如图所示进行分组,最后分成一组,就是直接插入排序。(增量设置成质数)每一组都会进行一次直接插入排序。void Shell(int *arr,int len,int dk){ int i; int j; int tmp; for(i=dk;i<len;i++) { tmp = arr[i]; for(j = i-dk;j >= ...原创 2020-05-01 18:59:23 · 142 阅读 · 0 评论 -
插入排序--直接插入排序
1.已排序部分2.待排序部分有数据的时候,划分出一个元素,肯定是有序的。剩下的就是待排序的部分。设置两个指针 i 和 j ,i 是待排序部分的第一个,j 是已排序部分的最后一个。需要一个中间变量保存arr[i],并且采用从 尾部 开始比较的方式,因为从尾部开始比较,可以使比较和移动 结合在一起。void InsertSort(int *arr,int len){ int i = 1;...原创 2020-05-01 18:03:55 · 146 阅读 · 0 评论