数据结构与算法
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 · 333 阅读 · 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 · 387 阅读 · 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 · 755 阅读 · 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 · 594 阅读 · 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 · 927 阅读 · 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 · 1174 阅读 · 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 · 752 阅读 · 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 · 296 阅读 · 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 · 841 阅读 · 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 · 300 阅读 · 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 · 235 阅读 · 0 评论