![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
code
U543470fa
双非本科(非科班自学C/C++)
展开
-
C++实现一个堆(更改堆中数据后,可以重新调整)
库中带的堆结构,无法实现更改后再调整,此时需要自己实现思路:使用一个hash表,保存数据与其对应的下标位置,需要更改时通过下标调整堆结构#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1#include<iostream>#include<vector>#include<hash_map>#include<string>using namespace std;//堆中存储数据使用自定义类原创 2022-04-12 10:59:59 · 346 阅读 · 0 评论 -
实现一个特殊的栈(能够返回栈中最小值)
实现一个特殊的栈(能够返回栈中最小值)思路:使用两个栈,data栈和min栈,同时进行push和pop,push时比较当前值与min栈栈顶元素大小,令较小值进栈。注:min栈始终记录着每一个状态下的最小值class m_stack{ public: void push(int value) { if(data.empty()&&min.empty()) { data.push(value); min.push(value); } el原创 2022-04-09 15:58:25 · 394 阅读 · 0 评论 -
C语言—快排nlogn
快排代码实现思想:分治//将L-R范围上的元素分成三部分,并将左右两个部分的边界返回int* partition(int arr[],int L,int R){ srand((unsigned int)time(NULL)); int num=rand()%(R-L+1)+L;//随机生成指定元素,当指定元素太大或太小(相对于数组内部而言),都将影响快排效率 int left=L-1; int right=R+1; while(L<right) { //第一部分:小于指定元素的原创 2021-11-13 15:37:03 · 763 阅读 · 0 评论 -
C语言—归并排序
归并排序思想:分治(从下而上)void process(int arr[],int L,int mid,int R){ int* a=(int*)malloc(sizeof(int)*(R-L+1); int i=L; int j=mid+1; int k=0; while(i<=mid&&j<=R) { if(arr[i]<arr[j]) a[k++]=arr[i++]; else a[k++]=arr[j++]; } while(i&原创 2021-11-13 15:53:52 · 597 阅读 · 0 评论 -
C语言——堆排序
从小到大排序:建大根堆大根堆(大顶堆)是指根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,属于二叉堆的两种形式之一。//交换两个位置的值void swap(int arr[], int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}//建大根堆,找到最大元素void heapinsert(int arr[],int index){ while(arr[index]>arr原创 2021-11-14 14:27:35 · 932 阅读 · 0 评论 -
C语言——冒泡、选择、插入
//冒泡排序void bubsort(int arr[],int n){ int i,j,flag; for(i=n;i>=0;--i) { flag=1; for(j=0;j<i-1;++j) { if(arr[j]<arr[j+1]) { swap(arr,j,j+1); flag=0; } } if(flag) break; }}//选择排序void selsort(int arr[],int n){ in原创 2021-11-15 14:12:46 · 1181 阅读 · 0 评论 -
单链表逆置:空间复杂度O(1)
带头结点单链表逆置从链表(带头结点)首个数据结点开始,重新头插法建表,将节点链接到头结点上//单链表结点结构typedef struct LNode{ int data; struct LNode* next;}LNode;void Inversion(LNode* head){ LNode* phead=head->next; LNode* q; head->next=NULL; //头结点next指针置空 while(phead!=NULL) { q=ph原创 2021-12-02 10:37:16 · 772 阅读 · 0 评论 -
递归、非递归实现二叉树先序、中序、后序遍历
1.递归//中序遍历void inorder_traversal(Node* head){ if(head==NULL) return ; if(head->left!=NULL) inorder_traversal(head->left); printf("%d ",head->val); if(head->right!=NULL) inorder_traversal(head->right);}//先序遍历void preorder_traversal原创 2021-11-16 18:01:36 · 299 阅读 · 0 评论 -
判断二叉树是否是二叉搜索树
二叉搜索树:任何一个节点的值都比左子树上的值大,比右子树上的值小判断:二叉搜索树中序遍历是一个递增序列1.中序遍历放入容器vector中,依次比较相邻元素void inorder_traversal(TreeNode& root,vector<TreeNode> v){ if(root==NULL) return ; inorder_traversal(root->left,v); v.push_back(root); inorder_traversal(root-原创 2021-11-17 09:56:42 · 846 阅读 · 0 评论 -
链表:查找倒数第k个位置上的节点
//链表结点结构typedef struct Node{ int data; struct Node* next;}Node;思路:双指针,快指针先走k步,之后另一指针开始移动快指针:k+(n-k)慢指针:(n-k)此时慢指针来到倒数第k个结点位置int findElem(Node* head,int k){ int i=0; Node* phead=head->next; //带头结点的单链表 Node* p=head; while(phead!=NULL) {原创 2021-12-01 17:06:26 · 304 阅读 · 0 评论 -
数据结构与算法——反转链表
1.使用容器栈ListNode* reverseList(ListNode* head) { if(head==NULL) return head; stack<ListNode*> s; ListNode* p=head; while(p!=NULL) { s.push(p); p=p->next; }原创 2021-11-15 16:52:40 · 237 阅读 · 0 评论