基础算法
Future_LL
Believe in the future.
展开
-
Java 实现四位数的吸血鬼算法
public class Main { public static void main(String[] args) { int[] startDigit = new int[4]; int[] productDigit = new int[4]; // 可以判断: 两个数只有两位数字,num1和num2代表这两个数 ...转载 2020-01-29 15:13:44 · 252 阅读 · 0 评论 -
C语言实现插入排序
一、代码 //使用插入排序对数据进行排序;#include<stdio.h>#define N 10 //需要排序的数据元素数量;void InserSort(int a[]) //直接插入排序;{ for(int i=1;i<N;i++) { int t=a[i]; //取出一个没有排序的数据; for(int j=i-1;j>=0&a...原创 2019-01-24 14:26:04 · 2323 阅读 · 1 评论 -
C语言实现堆排序
一、代码 /*堆:堆是一棵完全二叉树; //堆是完全二叉树,完全二叉树不一定是堆;分类:大根堆 根比左右子树大; 小根堆 根比左右子树小;堆排序:(升序为例) 1.数据集合的存储:将数据集合存储为完全二叉树; 2.将end指向最后一个结点,pa指向最后一个双亲结点, 双亲分别于左右子树交换,比左子树大不变,反之交换,之后比较右子树,...原创 2019-01-24 14:45:43 · 3371 阅读 · 4 评论 -
C语言实现二叉树排序
一、代码 #include<stdio.h>#include<stdlib.h>#define N 10int a[N]={3,2,5,8,4,7,6,9,1,10};typedef struct tree{ int data; struct tree *lchild; struct tree *rchild;}BitTree;void S...原创 2019-01-24 15:35:09 · 2612 阅读 · 0 评论 -
C语言实现归并排序
一、代码 #include<stdio.h>#define n 5 //数组Data1的元素个数;#define m 9 //数组Data2的元素个数;int Data[n+m]; //存放归并排序后的数组;//调用函数将两个有序数组合并成一个; void PAmay(int Data1[],int Data2[]){ int i,j,k,*p; ...原创 2019-01-24 16:44:50 · 662 阅读 · 0 评论 -
C语言实现快速排序
一、代码 我觉得快速排序就是一个找坑,填坑的过程 这里有一个博客地址,里边有很详细的关于快速排序的解释,结合代码很容易弄明白 https://blog.csdn.net/morewindows/article/details/6684558 #include<stdio.h>#define N 10int Division(int a[],int left,...原创 2019-01-24 16:56:24 · 981 阅读 · 1 评论 -
C语言实现希尔排序
一、分析把希尔排序比作给人的身高排序 注意: 每次分组后,组内都是使用插入排序法进行排序 二、代码 #include<stdio.h>#define max 100 //数组大小;void ShellSort(int a[],int n){ //分组:以数组长度/2为起始分组点 //循环结束执行delta/2:再一次...原创 2019-01-26 18:30:25 · 3000 阅读 · 0 评论 -
C语言实现折半插入排序
一、要点每次折半插入的范围都是下标从0到要插入元素的前一个元素 插入前都要将要插入位置之后的元素向后移动一位一直到要进行插入的元素二、代码 //折半插入排序;#include<stdio.h>#define N 10//对数组a进行折半插入排序,n为数组的长度;void Half_Sort(int a[]){ for(int i=1;i<N;...原创 2019-01-26 20:23:11 · 3011 阅读 · 2 评论 -
C语言实现链式队列
一、代码 #include<stdio.h>#include<stdlib.h>#include<malloc.h>#define N 15typedef struct { int data[N]; //队列数组; int head; //队头; int tail; //队尾;}SeqQueue;SeqQueue *SeqQ...原创 2019-03-05 18:48:41 · 1337 阅读 · 1 评论 -
C语言——实现链栈
一、代码 //栈的链式存储结构//链栈的类型定义#include<stdio.h>#include<stdlib.h>typedef struct node{ int data; /*数据域*/ struct node *next; /*指针域*/}LinkStack;/*链栈结点类型*///判别空栈int StackEmpty(LinkSta...原创 2019-03-05 18:57:03 · 338 阅读 · 0 评论 -
C语言——实现栈
一、代码 //栈的建立;#include <stdio.h>#include <stdlib.h>#define MAX 10 //定义最大栈容量//定义栈类型 typedef struct{ int data[MAX]; int top;}SeqStack;//栈的初始化SeqStack SeqStackInit(){ ...原创 2019-03-05 21:39:50 · 256 阅读 · 0 评论 -
C语言实现贪心算法——装箱问题
一、代码 //装箱问题;#include<stdio.h>#include<malloc.h>#define V 10 //一个箱子所能装的最大体积;//物品信息;typedef struct { int gnum; //物品编号; int gv; //物品体积;}Goods;//物品链;typedef struct Node...原创 2019-03-04 18:53:04 · 4084 阅读 · 0 评论 -
两个大整数相乘
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。 #include <stdio.h>#include <string.h> //反转字符串void revstr(char *a){ int i; char temp; int l=strlen(a); for(i=0;i...原创 2019-03-14 23:33:16 · 638 阅读 · 0 评论 -
常见的排序算法的稳定性
分析一下常见的排序算法的稳定性,每个都给出简单的理由。 冒泡排序 冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。...原创 2019-03-16 09:47:51 · 1420 阅读 · 0 评论 -
基础算法:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
这里要注意的是当数字足够大的时候,我们要使用long long形式的类型,用来记录那个最大值 最大值共有四种情况: 三个正数:数字本身越大则乘积越大 两个负数一个正数:负负得正,所以两个负数最小,之积最大 两个正数一个负数: 这种情况,如果只有【正,正,负】【正,正,负,负】【正,正,负,负,负】【正,正,正,负,负】 所有的情况都包含在第一种和第二种情况里,所以这种情况可...原创 2019-03-12 23:25:46 · 2834 阅读 · 1 评论 -
B-树,B+树,红黑树的简单介绍
B+树介绍: B+树是基于B-树的一种变体,它有着比B-树更高的查询性能。 一个m阶的B+树具有如下几个特征: 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。 所有的中间节点元...原创 2019-04-28 09:45:29 · 840 阅读 · 0 评论 -
C语言—冒泡排序及其优化
原始冒泡排序实现 #include<stdio.h>int main(void){ //定义数组大小 int N=8; //用于计算交换的次数 int sum=0; //定义数组元素 int array[]={5,8,6,3,9,2,1,7}; //使用冒泡的方式进行排序 for(int i=0;i<N;i...原创 2019-05-27 21:01:24 · 3214 阅读 · 0 评论 -
C语言实现二叉树的非递归遍历
C语言实现二叉树的非递归遍历: 代码解释:非递归前序遍历: 1> 首先建立一个二维指针,用来存储每个结点的地址,定义栈顶指针top,初始值为-1,并将根结点存入栈中,top++; 2> 进入while循环,栈顶指针不为-1,则进入while循环,输出当前栈顶元素p的数据域,代表前序遍历的第一个结点为根结点; 3> 如果...原创 2018-04-26 21:29:56 · 12508 阅读 · 22 评论 -
C语言实现交换二叉树左右子树
C语言实现二叉树左右子树的交换:代码解释: 创建树: 1> 首先声明一个根结点bt,给系统输入一个字符,并进行,如果字符是'#',则返回NULL; 2> 如果字符不是'#',则给根结点建立建立结点,并将刚输入的字符赋给该结点的数据域 ch ,之后将这个结点的的递归调用下一个结点赋给这个结点的左子树; 3> 如果遇到输入的值为...原创 2018-04-20 10:40:30 · 21018 阅读 · 15 评论 -
正向建立单向链表。
//***明白这个需要对指针有一定的了解: 数据域用来存储结点的数据,可以新建立一个一个类型用来存储不同的数据; 指针域用来存储一个地址,指向存储这个地址的结点;//正向建立链表;#include<stdio.h>#include<stdlib...原创 2018-03-26 23:58:38 · 1367 阅读 · 0 评论 -
约瑟夫环的实现
//一共十个人,编号为1到10,从第一个人开始数数字,按照1,2,3的顺序循环,数到3的人出列,直到剩下最后一个人,输出这十个人的派出次序;//实现Josephus(约瑟夫环);#include<stdio.h>void Josephus_Ring(int a[],int n,int s){ int i=0; while(n>1) { i=i+s-1; ...原创 2018-03-28 08:19:26 · 305 阅读 · 0 评论 -
讨论指针
今天第一个问题,什么是指针:我觉得指针就是一个指向地址单元的指向;通俗的将,比如:我现在表示一个指针,我的大脑里存了另外我朋友家的地址,所以我可以到我的朋友家,也就是我指向了我朋友家;图例:举例://只要清楚的记得,指针存的是一个指向的地址,指针指向这个地址,也就是指向这个单元;//通过指针交换x,y的值;#include<stdio.h>void exchange(int...原创 2018-03-28 08:54:47 · 158 阅读 · 0 评论 -
C语言实现迷宫问题一种解
迷宫问题一组解: //迷宫问题解答: 首先需要定义的变量:迷宫M , 迷宫的行R=7 , 迷宫的列C=8 , 还需要定义一个与迷宫M相同的二维数组t(用来表示迷宫这个格子已经走过了,走过赋值为1) , 以及记录方位的二维数组Move[4][2](f方位表示已经在代码中给出注释); //迷宫问题需要注意的点: ...原创 2018-04-10 21:06:23 · 1270 阅读 · 4 评论 -
C语言实现按照索引插入并查找元素
//我觉得代码基本上都有注释,我也不知道解释什么,有不懂的可以给我发留言;#include<stdio.h>#define LEN 30typedef struct{ int index; //索引值; int start; //开始位置; int length; //子表长度;}Index_Table;//定义主表数据;int Master[LEN]={...原创 2018-04-03 21:17:30 · 2204 阅读 · 2 评论 -
C语言实现迷宫问题的所有解
迷宫问题所有解: //迷宫问题解答: 首先需要定义的变量:迷宫M , 迷宫的行R=7 , 迷宫的列C=8 , 还需要定义一个与迷宫M相同的二维数组t(用来表示迷宫这个格子已经走过了,走过赋值为1) , 以及记录方位的二维数组Move[4][2](f方位表示已经在代码中给出注释) , 定义一个栈stack[100][2](用来存储路径上...原创 2018-04-11 13:05:20 · 9378 阅读 · 6 评论 -
C语言实现二叉树的插入和删除
二叉树的插入删除://首先介绍二叉树的插入: //首先需要明白插入的规则:每个建好的结点p都需要从跟结点开始与根结点相比较数据域,如果根结点的数据域小于结点p,则接着将结点p与根结点的右子树相比较,否则p将与根结点的左子树相比较; //继续往下类推,一直到最后一次比较完后,指针head的左子树或者右子树为空,退出循环(也就是,当到达叶子结点时),因为每次进入循环都要把head结点赋...原创 2018-04-17 01:26:18 · 19886 阅读 · 7 评论 -
C语言实现两个超大数组相加
//任意两个一百位以上的整数相加;//用字符串存储,数组输入相加后的和并输出;//由于不知道相加后的结果,而且数组没办法提前知道所得结果的长度,所以需要将数组设置的尽量大;#include<stdio.h>#include<string.h>#define N 200 //设定存储相加之和的数组大小;int main(void){ char s1[100]...原创 2018-03-29 00:19:41 · 10473 阅读 · 6 评论 -
C语言实现递归式遍历二叉树
//递归实现二叉树的遍历;//通俗来讲: 先序遍历:就是第一次遇到结点的顺序记录; 中序遍历:就是第二次遇到结点的记录; 后序遍历:就是第三次遇到结点的记录;#include<stdio.h>#include<stdlib.h>typedef struct tree { char ch; s...原创 2018-04-12 09:30:02 · 1474 阅读 · 2 评论 -
C语言实现八皇后一种解
//这段代码不好理解的地方就是,在left和right数组上;//col数组表示皇后所在位置的列是否还有其他的皇后,这个很好理解;//如果还是有问题可以给我留言,我看到会回复;#include<stdio.h>int col[8]={0}; //表示列,该列有元素则赋值为1;int left[15]={0}; //表示偏左的斜线,斜线上有元素赋值为1;int righ...原创 2018-04-04 22:28:57 · 336 阅读 · 1 评论 -
C语言实现递归的二分查找
//二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法;//但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列;//二分查找,总体来说不能,唯一不好想的就是递归的这个过程: //首先分为两个过程,第一就是找到了,第二个就是没找到;//①:因为这个数组是排好序的,所以将当前的比较区间的中间值与key比较,key比中间值大,则说明key...原创 2018-03-29 16:59:54 · 8201 阅读 · 8 评论 -
C语言实现八皇后所有解
//这道题不好理解的地方就是left和right数组;//left数组的表示我在下图中标示出来了,如果还有不懂的可以给我留言;//还有一个不好理解的地方就是,在这一行没有找到合适的位置,需要回溯到上一行,这里在代码中有提示,但是不太好想;//这一行没有合适的位置,就会从for循环中出来,代码自己就回到上一行,并且回到上一行的皇后位置,所以就需要清0,表示这个位置不能放皇后,之后继续循环j++;//...原创 2018-04-05 22:05:17 · 996 阅读 · 1 评论 -
C语言递归实现二叉树的深度求解
递归实现二叉树的深度求解: 代码解释://先定义两个变量,初始化为0 int ld=0,int rd=0;分别表示左子树和右子树的深度;//先判断二叉树bt是否为空,为空直接return返回;//不为空,进入左子树的递归调用,此时ld=1,一直到某个结点的左子树为空,if条件不成立,返回上一层递归调用;//之后进入右子树的递归调用,再进入这个结点的左子树一直到左子树为空,返回上...原创 2018-04-12 18:55:28 · 7163 阅读 · 0 评论 -
C语言实现二叉树的分层遍历
C语言实现二叉树的分层遍历:代码难点: 第一点:先将初始化过得数组,变成符合规范的二叉树(规范:双亲结点大于左子树,小于右子树)的过程; 第二点:存储结点的队列,只要输出一个结点,就将它的左右子树按照顺序存储的队列中,这样,当遍历完这一层的右半边时,可以回到下一行的最左边的结点;代码难点解释: 第一点: A>首先建立根结点,赋给BitTree *bt;...原创 2018-04-18 20:05:55 · 4183 阅读 · 7 评论 -
C语言实现马踏棋盘
//马踏棋盘主要要考虑三个因素://第一:马走的位置用Move数组表示,以及棋盘的大小不再是8*8,而是12*12;//第二:只要找到马可以踏的下一个位置,就进行递归,只有一只进行递归,这是一种理想状态;/第三:也是最不好想的一点,如果在当前位置,准备进行下一个位置,但是没有找到,就需要回溯,回溯需要将计数器--,并且将这个位置赋值为0,表示这个位置没走过,因为回溯本身就在for循环中...原创 2018-04-07 14:43:01 · 4157 阅读 · 5 评论 -
C语言实现哈希查找
//哈希查找的主要过程是如何建立以哈希表及如何解决元素位置占用的问题;/* 建立哈希表: 首先需要初始化哈希表,并且确实哈希表的长度; 并且根据(数据)%(哈希表长度)计算出数据在哈希表中的位置; 解决元素占位问题: 如果在计算出这个数据在哈希表中的位置,但是这个位置上有元素,则将这个位置++,将这个数据...原创 2018-03-31 22:51:03 · 6848 阅读 · 0 评论