
算法
哦吼~
心如欲壑,厚土难填。
展开
-
单链表实现快排
单链表实现快排思想快排的思想:以一个点为分割点,将数组分割成前半部分比这个点小,后半部分比这个点大的两部分,然后再递归对这两半段进行上述同样的操作,然后合起来(此处一般直接在原数组中进行操作,交换元素),是一种分治的思想。转移到链表上:以一个点为分割点,将链表分割成比这个点大的大链表部分,一个比这个点小的小链表部分,然后缩小范围,递归~代码演示public class 链表实现快排 { private static Node tail = null; public static void原创 2020-09-26 15:05:12 · 528 阅读 · 3 评论 -
堆排序
1.堆:堆是一种完全二叉树2.分类:(1)大顶(根)堆:根结点的值大于(等于)其左右子女结点的值(2)小顶(根)堆:根结点的值小于(等于)其左右子女结点的值3.目的:进行排序(选择类排序)4.堆的创建:(1)创建完全二叉树(2)调整大(小)根堆#include<bits/stdc++.h>typedef struct node{ int data; struct...原创 2019-08-25 23:31:03 · 128 阅读 · 0 评论 -
HuffmanTree
#include<stdio.h>#include<stdlib.h>#define N 100typedef struct{ char data[5];//名称 float weight;//权重 int parent;//双亲结点 int lchild;//左孩子结点 int rchild;//右孩子结点 }HTNode;typedef ...原创 2019-07-04 23:07:30 · 222 阅读 · 0 评论 -
哈夫曼编码
1.最优二叉树(哈夫曼树)(1)结点的权:赋予叶子结点一个有意义的值(2)结点的路径长度:从根结点到当前结点的边的个数(3)结点的带权路径长度:WxL W:结点的权 L:结点的路径长度(4)二叉树的带权路径长度:(wpl)一棵二叉树的所有叶子结点的带权路径长度之和 表示∑WixLi(i=1:n)(5)最优二叉树:一棵二叉树的带权路径长度最小2.Huffman Tre...原创 2019-09-02 00:28:33 · 144 阅读 · 0 评论 -
贪婪+回溯--迷宫问题--全部路径和最短路径
1.0#include<stdio.h>#include<stdlib.h>#define R 7//行 #define C 8//列 int M[R+2][C+2]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,1,1,1}, {1,1,1,1,1,1,0,1,1,1},{1,1,1,...原创 2019-09-13 15:53:54 · 540 阅读 · 0 评论 -
马踏棋盘
算法思想:构建一个国际棋盘8x8,由于在边界时马也会踏日而马又不能踏出棋盘,所以给棋盘两边加上墙(即不能踏),将其标为-1,棋盘能踏标为0.玩过象棋的都知道马可以踏八个方向,即以自己为中心的八个“日”字,只不过象棋是在交点上,而国际棋盘踏在方格中,所以构造偏移数组,即Move,记录每次要踏的方向,然后试探,回溯。同时利用cnt为其每次踏编号,踏够64即完成。#include<b...原创 2019-09-13 15:54:13 · 198 阅读 · 0 评论 -
设有一个数据序列,查找和值最大的连续子序列
//设有一个数据序列,查找一个连续子序列,其和值最大 //1.0暴力 /*#include<bits/stdc++.h>int max = -2147483647;int mi,mj;void MaxSum(int a[],int n){ int i,j,k; for(i=0;i<n;i++){ for(j=i;j<n;j++){ int sum...原创 2019-08-27 00:26:33 · 451 阅读 · 0 评论 -
归并排序
package com.Fengkuangjava.分治法;import java.util.Scanner;import java.util.Stack;//归并排序的思想是:将数组一分为二,然后对左边排序,再对右边排序//然后左边又一分为二,然后重复上面过程,右边也一分为二,重复上面过程public class 归并排序 { /** * * @para...原创 2020-01-26 20:34:10 · 126 阅读 · 0 评论 -
快速排序
package com.Fengkuangjava.分治法;import java.util.Arrays;import java.util.Scanner;/*快速排序的思想:以一个基准元素,以它为中心将数组分为左边全比它小,右边全比它大然后递归判断其左边区间,重复上面过程,直到只有一个元素为止 */public class 快速排序 { public static vo...原创 2019-08-30 21:13:41 · 139 阅读 · 0 评论 -
基数排序
package com.Fengkuangjava;import java.util.*;//基数排序:是桶排序的特殊情况,基本思想为:将所有元素分为若干组//分组依据为其位数,比如:个位、十位、百位...然后将分号组的元素按顺序拿出来放入数组中,//重复此过程,直到所有位数都分配过(即数组中最大数的位数也已经用过)//基数排序对有负数和0的数列难以进行排序////因此,往往有0和...原创 2020-01-28 00:48:57 · 102 阅读 · 0 评论 -
希尔排序
package com.Fengkuangjava;import java.util.Arrays;import java.util.Scanner;public class 希尔排序 {//缩小增量法 public static void shellSort(int[] nums){ int step = nums.length/2; for (...原创 2020-01-28 21:05:27 · 180 阅读 · 0 评论 -
折半插入排序
package com.Fengkuangjava;import java.util.Arrays;import java.util.Scanner;public class 折半插入排序 { public static void binsertSort(int[] nums){ for (int i = 1; i < nums.length; i++) {...原创 2020-01-28 21:42:09 · 175 阅读 · 0 评论 -
桶排序
package com.Fengkuangjava;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Random;/*桶排序的原理是:将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排...原创 2020-01-27 23:53:48 · 106 阅读 · 0 评论 -
Dijkstra算法
1.迪杰斯特拉(Dijkstra)算法:是典型最短路径算法,用于计算一个节点到其他节点的最短路径。2.算法思路指定一个节点,例如我们要计算 ‘A’ 到其他节点的最短路径引入两个集合(S、U),S集合包含已求出的最短路径的点(以及相应的最短长度),U集合包含未求出最短路径的点(以及A到该点的路径,注意 如上图所示,A->C由于没有直接相连 初始时为∞)初始化两个集合,S集合初始时 只有...原创 2019-12-30 09:27:55 · 167 阅读 · 0 评论 -
全排列
package 全排列;import java.util.Arrays;import java.util.Scanner;/*全排列的思想就是:每次将一个数字取出来放到最开始的位置然后,对1~n-1进行全排列,然后范围逐渐缩小 */public class 全排列 { public static void main(String[] args) { ...原创 2020-01-28 22:10:31 · 95 阅读 · 0 评论 -
计数排序
package com.Fengkuangjava;/*计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键,存储在额外的空间中,作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定的范围。 */import java.util.Arrays;import java.util.Scanner;//给定10^7个数,每个数在0~10^6之间public cla...原创 2020-01-28 00:37:25 · 95 阅读 · 0 评论 -
贪婪算法-----装箱问题
1.贪婪准则:(1)贪婪准则设计算法过程的每一步的最优解(局部最优)(2)贪婪准则一旦设好,中途不变2.贪婪准则并不一定可以得到最优解。装箱问题:问题描述:有若干个体积为v的箱子,若有n个物品:v0,v1,v2…vn要求:将所有物品都装入箱子中,使打开的箱子尽可能少贪心准则:将所有物品按体积降序排列每次取出一个物品(当前未装入箱子中体积最大的)遍历所有已打开的箱子,将该物品放入一...原创 2019-08-28 23:49:27 · 578 阅读 · 0 评论 -
贪婪+回溯---迷宫问题--求解一条路径
//求一条路径#include<stdio.h>#include<stdlib.h>#define R 7//行 #define C 8//列 int M[R+2][C+2]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,1,1,1,1},{1,0,0,0,0,1,1,1,1,1}, {1,1,1,1,0,0,0,0,0,1},{1,...原创 2019-09-13 15:53:42 · 131 阅读 · 0 评论 -
带表头结点的删除算法
//带表头结点的链表插入和删除不用考虑有无前驱指针//设数据域值不重复,删除值为key的结点void Delkeynode(ElemSN *h,int key){ ElemSN *p,*del; for(p=h;p->next&&p->next->data!=key;p=p->next); if(!p->next){ printf(...原创 2019-03-28 22:32:54 · 784 阅读 · 0 评论 -
递归
1.递归:不改变问题性质,逐渐缩小问题规模,直至得到解。要素:结束条件------递归已知条件递归方程2.实现:递归函数-----函数的自我调用3.递归的执行效率不高//输出给定的正整数x的二进制码void Bin(int x){ if(x){ Bin(x/2); printf("%2d",x%2); }}//输出5!int Fun(int n){ if(n...原创 2019-04-08 17:11:33 · 173 阅读 · 0 评论 -
数组的递归
//逆向输出数组中的值#include<bits/stdc++.h>using namespace std;void Print(int a[],int n){ 1.0if(n){//尾部递归 Print(a+1,n-1); printf("%4d",a[0]); } 2.0if(n){//头部递归 printf("%d",a[n-1]); Print...原创 2019-04-08 18:20:13 · 2370 阅读 · 0 评论 -
选择排序法(链表)&(数组)
//数组实现#include<stdio.h>#include<stdlib.h>#define N 8void Sortarray(int *a){ int i,j,k,t; for(i=0;i<N-1;i++){ k=i; for(j=k+1;j<N;j++){ if(a[k]>a[j]){//找到最小元素的下标 k...原创 2019-03-25 23:45:07 · 418 阅读 · 0 评论 -
插入排序(数组&&链表)
//思想:将数组分为有序和无序两部分//有序:a[0]//无序:a[1]~a[n-1]//遍历无序区间的所有元素,每次取出无序区间的第一个元素,a[i]//和有序区间的元素进行比较,将a[i]插入到有序区间的合适位置#include<bits/stdc++.h>#define N 8void InsertSort(int a[]){ int i,j,x; for(i...原创 2019-04-15 22:58:08 · 591 阅读 · 0 评论 -
链表的递归
//设head指向一个非空单向链表(其数据域值均为正整数)//输出链表所有结点数据域的值#include<stdio.h>#include<stdlib.h>typedef struct node{ int data; struct node*next;}ElemSN;ElemSN *Createlink(int a[],int n){ ElemSN *...原创 2019-04-10 00:31:26 · 255 阅读 · 0 评论 -
冒泡排序法
//冒泡排序法//即每一趟比较都会使得最小或者最大的元素//像水中气泡一样上浮//每一趟都会有一个元素排好序1.0#include<stdio.h>#define N 8void PubbleSort(int a[]){ int i,j,t; for(i=0;i<N-1;i++){//进行n-1趟比较 for(j=N-1;j>i;j--){//遍历...原创 2019-04-16 20:29:37 · 164 阅读 · 0 评论 -
散列(Hash)查找
设有一长度为m的散列空间:将某一数据集合中的数据存储在该散列空间中散列函数:用来计算存储数据元素的地址的函数H(k)=k%m(除留余法)缺陷:容易造成堆积容易产生冲突(即地址被占用)解决冲突:线性探查法:d=(d+1)%m/(d+i^2)%m拉链法:其实就是用链表的结构特点,将要查找的元素范围急剧缩小在里面进行查找,如果地址里内容为空或者跑完局部链没找到说明没有此元素 反之找到...原创 2019-04-26 17:59:10 · 153 阅读 · 0 评论 -
栈与递归的应用------汉诺塔
/*汉诺塔的规则为:三根柱子,上面放有若干盘子,要求无论哪次移动,小盘子都必须在大盘子上面,完成其从A柱到C柱的移动这个问题可以用递归来实现①将A柱子上的盘子都移到C柱上,那么A柱子上的n-1个盘子就得先移到B柱上,这样A柱子上的编号为n的盘子就可以移到C柱子上了②然后将B柱上n-1个盘子,要移到C柱子上,应该先将B柱上的n-2歌盘子移到A柱子上,再将B柱编号为n-1的盘子移到C柱子上③依...原创 2019-04-17 22:41:01 · 213 阅读 · 0 评论 -
二分查找
//二分查找 :必须是有序序列,若为无序,可以先进行排序//在首元素和末尾元素分别放两个‘’指针‘’指向,然后通过判断中间元素与要查找的元素,来实现折半查找//查找值为p的元素,若找到,返回这个元素的下标和值,否则返回-1#include<bits/stdc++.h>using namespace std;void Sortarray(int a[],int N){ in...原创 2019-04-17 22:59:52 · 176 阅读 · 0 评论 -
KMP算法
//BF算法/*对于此算法,也是最常规的做法,同时遍历主串和模式串,判断字符相等则同时向后继续判断是否匹配当不匹配时,主串从刚才开始的位置的下一个位置开始向后继续判断,而模式串则从最开始位置,同此时的主串一起同时向后判断遍历判断,重复此过程对于一定量的效率可行当数据量达到一定量时,会花费很长很长时间取等待结果*/#include<bits/stdc++.h>#defin...原创 2019-04-26 22:16:06 · 121 阅读 · 0 评论 -
二分查找的基本应用----求方程的根&输入n个整数 ,找出其中两个数之和等于整数m
//例:y=x3-5x2+10x-80//对y求导,y’=3x^2+10x+10,y’恒大于0,因此y是单调递增的,//因此可以运用二分查找来 逐渐所小范围,找到方程的近似根#include<bits/stdc++.h>using namespace std;double MIN=1e-6;//10^-6 ,相当于0 int B(double x){ return x*...原创 2019-04-18 16:45:55 · 912 阅读 · 0 评论 -
逆波兰表达式
//逆波兰表达式思路:构建两个栈,一个为数值栈,一个为运算符栈。//遇到栈内的运算符比字符串中的运算符低,就压栈,否则,出栈,并且数值栈元素出栈,并做计算//然后将计算结果压栈//重复此过程,最后将字符栈中字符出空,数值栈中元素压栈,输出栈底元素。#include<bits/stdc++.h>#define N 81using namespace std;int Leve...原创 2019-04-20 12:52:06 · 127 阅读 · 0 评论 -
回溯法--八皇后问题(非递归)
//回溯法(试探法)---八皇后问题--非递归 //打印一组解 /*#include<stdio.h>int col[8]={0};int left[15]={0};int right[15]={0};int Q[8]={0};void Queen(void){ int top,i,j; i=0; top=-1; j=0; while(top!=7){//栈不...原创 2019-09-13 15:53:03 · 892 阅读 · 1 评论 -
回溯法--八皇后问题(递归)
#include<stdio.h>int col[8]={0};int left[15]={0};int right[15]={0};int Q[8]={0};int cnt=0;void Print(){ for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ if(Q[i]==j){//皇后的位置 其中下标i为行...原创 2019-09-07 00:40:11 · 139 阅读 · 0 评论 -
大整数计算(13的100次方)
//求13的100次方#include<stdio.h>#define N 1000int main(){ int i,j,cp,x,a[N],s; a[N-1]=1; //数组最后一个元素值为1 s=N-2; //岗哨 for(i=1;i<101;i++){ cp=0; for(j=N-1;j>s;j--){ x=a[j]*13+c...原创 2019-03-16 11:44:48 · 1152 阅读 · 0 评论