数据结构与算法
冯Jungle
C++开发者
展开
-
每天都刷朋友圈,那你知道并查集吗?
微信大概是我们每天必须接触的一个APP之一,公交上、地铁上,异或工作休息时,我们都忍不住刷刷朋友圈,看看一些点赞之交的朋友当天又经历了什么。相较于QQ,微信的一个特点之一就是:除非好友的好友也是你的好友,否则你在朋友圈里看不到好友的好友对好友朋友圈的点赞和评论。今天刷LeetCode,发现了一道名为“朋友圈”的题目:不过题目的要求和微信朋友圈不一样。题目说明,如果A和B是朋友,B和C是...原创 2020-05-04 00:01:09 · 735 阅读 · 3 评论 -
C++实现希尔排序法
希尔排序法是对直接插入排序法的优化,通过设置一个增量,对原始序列进行分组,对每组用直接插入排序法排序再整合,再缩小增量,周而复始直至增量为1,完成排序,因此又叫“缩小增量排序法”。本节Jungle图文并茂介绍一下希尔排序法,并给出C++代码。1.举例说明希尔排序法过程以一个整数序列为例来说明{12,45,90,1,34,87,-3,822,23,-222,32},该组序列包含N=11个数。...原创 2018-07-06 22:06:38 · 2847 阅读 · 1 评论 -
C++实现归并排序法
本节内容Jungle用C++实现实现归并排序法。在百度百科里,对归并算法是如下说明的: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 由此可看出,归并排序分为两个步骤:排序每个子序列,合并两个有序数列。其...原创 2018-07-07 21:50:32 · 1312 阅读 · 0 评论 -
C++实现快速排序法
快速排序法,要点在于选取一个基准值,通过一次比较将大于该基准值的数放到该基准值的一侧,小于该基准值的数放到该基准值的另一侧,再分别对两侧的子序列重复上述过程,以此完成排序。本节Jungle图文并茂举例介绍快速排序法。 对于初始序列:{12,45,90,1,34,87,-3,822,23,222},快速排序法过程如下:1.快速排序过程讲解2.代码实现void quickSort...原创 2018-07-08 00:32:56 · 2670 阅读 · 1 评论 -
C语言实现通讯录
本程序用来写一个通讯录程序 头文件AddressBook.h定义结构体:#ifndef ADDRESSBOOK_H#define ADDRESSBOOK_H///标准输入输出#include <stdio.h>///系统函数#include <stdlib.h>#include <string>using namespace std;t...原创 2018-07-22 16:41:42 · 387 阅读 · 0 评论 -
二叉树的非递归遍历(前序、中序、后序)
定义树:class BSTree{public: BSTree(int idata) { data = idata; lChild = rChild = NULL; } ~BSTree(){} int data; BSTree *lChild,*rChild;};///BTNode用于非递归后序遍历用...原创 2018-08-03 22:19:11 · 182 阅读 · 0 评论 -
C++实现选择排序法
选择排序法的思想是从待排序的序列中找到最小(若从大到小排序,则找最大值)值加入到有序序列中。基于这个思想,很容易实现其算法。注意,选择排序法不是一种稳定的排序法,其时间复杂度为O(n2)。#include <iostream>using namespace std;void selectSort(int a[],int N){ int i,j,k; for(...原创 2018-08-08 01:28:49 · 2770 阅读 · 8 评论 -
C++实现堆排序
void adjustHeap(int arr[],int N,int i){ int j = 2*i; if(j<N && arr[j+1]>arr[j]) j++; if(j<N && arr[j]>arr[i]) { int temp = arr[i]; ...原创 2018-08-17 17:32:08 · 211 阅读 · 0 评论 -
寻找数组中前K个最小的数-堆排序
利用堆排序求数组中最小的k个数:void adjustHeap(vector<int> &arr,int N,int i){ ///构建小顶堆 int j = 2*i; if(j<N && arr[j+1]<arr[j]) j++; if(j<N && arr[j]<a...原创 2018-08-17 19:17:01 · 850 阅读 · 0 评论 -
平衡二叉树AVL
对于有N个节点的二叉排序树,我们期望其高度是LogN,但实际情况往往事与愿违。在极端情况下,比如在生成二叉排序树时,其插入的序列是个有序数列,此时的二叉树结构类似于一个链表,各个操作的时间与链表的操作无异。因此,通过某种方法使得二叉树左右子树深度一样或者相差不大是有意义和必要的。这就是平衡二叉树,也叫AVL树。1.AVL树定义平衡二叉树要么是空树,要么满足以下性质左右子树的高度之差的...原创 2018-07-12 21:35:48 · 309 阅读 · 0 评论 -
二叉排序树
二叉排序树,也叫二叉搜索树,也叫二叉查找树,是一种重要的数据结构。1.定义二叉排序树要么是一颗空树,要么具有以下性质: - 若左子树不空,左子树上的节点的值小于或等于根节点的值; - 若右子树不空,左子树上的节点的值大于或等于根节点的值; - 左右子树也均为二叉排序树。class BSTree{public: BSTree(int idata) { ...原创 2018-07-12 20:42:48 · 1779 阅读 · 0 评论 -
栈应用之平衡字符
编译器检查程序的语法错误,但是常常由于缺少一个符号(如遗漏一个花括号或者注释起始符),引起编译器列出上百行的诊断,而真正的错误并没有找出。这种情况下,一个有用的工具就是去检验成对出现的符号,比如每一个左花括号{都搭配一个右花括号}(方括号、圆括号等)。例如,”([])”是对的,而“({)}”显然是错的。 本节Jungle用栈来实现这样一个平衡字符的程序,两步走:1.链表实现栈的设计2.平...原创 2018-07-11 20:49:43 · 195 阅读 · 0 评论 -
C++实现冒泡排序法
冒泡排序法是一种经典的排序方法,虽然其效率较低,时间复杂度为O(n2),仅适用于数据规模较小的排序。但作为一种经典排序方法,还是应当学习掌握。 下面Jungle用C++实现两种冒泡排序法: ①传统的冒泡排序法sort_Bubble:内外两轮循环,前后两个数据依次比较; ②改进的冒泡排序法sort_Bubble2:同样是内外两次循环,但用一个标记来标识当前这一轮是否发生数据交换,如果没发生,说...原创 2018-05-24 23:03:55 · 2467 阅读 · 0 评论 -
最小二乘法拟合直线——MATLAB和Qt-C++实现
本节Jungle用C++实现最小二乘法拟合平面直线。1.理论知识平面直线的通用方程可以表示为 其中,A是直线的截距,B是直线的斜率。对于测量的二维坐标(x,y),x是精确分布的,而y是观测值。基于最小二乘的理论,我们要得到观测值的误差的平方和的最小值。我们设定目标函数为: 分别对A和B求偏导数,并命其为零,得到以下方程组: 解此方程组,则可以得到A和B。2.算法实...原创 2018-06-30 22:10:21 · 8406 阅读 · 0 评论 -
最小二乘法拟合圆——MATLAB和Qt-C++实现
本节Jungle尝试用最小二乘法来拟合圆,并用MATLAB和C++实现。1.理论知识根据圆心(A,B)和半径R可确定平面上一个圆。平面上圆方程的通式为 其中 第一个圆的通式是关于a、b和c的线性方程。利用最小二乘法建立圆拟合的数学模型,求得参数a、b和c的值,再根据第二个方程组求出圆的实际参数A、B和R。 在原始测得的N(N≥3)组数据(xi,yi),(i=1,2,3,…,N...原创 2018-07-01 21:24:46 · 19108 阅读 · 19 评论 -
最小二乘法拟合椭圆——MATLAB和Qt-C++实现
本小节Jungle尝试用最小二乘法拟合椭圆,并用MATLAB和C++实现。1.理论知识平面上任意位置的一个椭圆,其中心坐标为(x0,y0),半长轴a,半短轴b,长轴偏角为θ,方程通式为 其中 在原始测得的N(N≥5)组数据(xi,yi),(i=1,2,3,…,N)中,根据椭圆方程通式和最小二乘法原理,求目标函数 的最小值来确定参数A、B、C、D和E。令F(A,B,C,D,E)...原创 2018-07-01 21:31:26 · 12119 阅读 · 46 评论 -
最大子序列求和的两种算法--C++
题目: 连续输入一串整数,空格间隔,检测到输入回车键停止,计算当前输入序列的最大子序列和。(大疆2019校招笔试题目)两种方法(可惜当时一个也不知道):#include <iostream>using namespace std;#include <stdlib.h>#include <vector>//方法1(效率高,代码简洁)int ...原创 2018-07-10 20:57:03 · 550 阅读 · 0 评论 -
栈Stack的数组实现
Jungle用一个数组来实现栈以及栈的基本操作(入栈、出栈、是否为空、是否已满、打印)。 栈的所有功能和定义放在一个头文件里Static_Array_Stack.h#ifndef STATIC_ARRAY_ATACK_H#define STATIC_ARRAY_ATACK_H///栈里最大元素数量#define MAX_SIZE 5typedef struct STACK{ ...原创 2018-07-11 17:14:13 · 484 阅读 · 0 评论 -
栈Stack的链表实现
本节Jungle用链表指针实现栈和栈的基本操作(入栈、出栈、是否为空栈、打印栈元素、销毁栈)。头文件List_Stack.h里定义栈结构和栈的基本操作:#ifndef LIST_STACK#define LIST_STACKtypedef struct STACK{ int data; struct STACK* next;}Stack;//栈顶指针Stac...原创 2018-07-11 19:19:27 · 283 阅读 · 0 评论 -
C++实现直接插入排序法
直接插入排序法是将当前元素按照值大小,插入到有序元素组中的适当位置的一种排序方法。最直观的例子是玩扑克牌斗地主,每次摸牌之前,手上的牌是已经按大小排好顺序的,每次摸的牌都要插入到合适的位置。 因此,直接插入排序法的基本思想是: - 对于当前插入的元素a[i],之前的序列a[0],a[1],….,a[i-1]是有序序列; - 比较a[i]与之前有序序列的值,找到a[i]合适的插入位置; ...原创 2018-05-26 00:27:23 · 5536 阅读 · 1 评论