数据结构与算法
AmarisEx
Less is more ?
展开
-
插入排序及其优化(Java)
Codepublic static void insertSort(int[] arr){ int n = arr.length; int i; for(i=1;i<n;++i){ int j=i-1; while(j>=0&&arr[j]>arr[i]){ int temp = arr[j+1]; arr[j+1原创 2020-05-17 10:24:51 · 261 阅读 · 0 评论 -
快速排序及其优化(java)
public static void quickSort(int[] arr, int low, int high){ if(low>high)return; int i = low; int j = high; int temp = arr[low]; while(i<j){ //一定先从右边开始,便于最终exch(arr[low],arr[i])原创 2020-05-14 20:08:12 · 231 阅读 · 0 评论 -
排序算法小结
文章目录一、内部排序1. 插入排序2. 快速排序3. 选择排序4. 归并排序5. 基数排序二、外部排序一、内部排序1. 插入排序1.1 简单插入排序1.2 希尔排序2. 快速排序快速排序3. 选择排序3.1 简单选择排序3.2 堆排序4. 归并排序待更。。。5. 基数排序基数排序二、外部排序外部排序...原创 2020-04-29 09:51:31 · 71 阅读 · 0 评论 -
查找算法小结
文章目录顺序查找折半查找索引查找哈希查找基本概念常见哈希函数顺序查找之前写的算法每次visit某个元素都要进行两次比较,这里给出的只要一次比较元素值是否与目标值相等,奇妙????O(n)O(n)O(n)int sepSearch(int data[], int n, int val){ int i = n; data[0] = val;//用来存val,作为枢纽 whi...原创 2020-04-29 09:36:43 · 111 阅读 · 0 评论 -
单源/多源最短路径
单源最短路径单元无权最短路径int dist[MAX_VERTEX];int path[MAX_VERTEX];void unWeightedSP(int v){ for (int i = 0; i < nv; ++i) { dist[i] = -1; } dist[v] = 0; queue<int> q; q.push(v); while (!q....原创 2020-04-03 16:23:20 · 1261 阅读 · 0 评论 -
HuffmanTree
哈夫曼树给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。哈夫曼树的生成这里采用最小堆进行生成事先把带权值的结点生成最小堆然后,如下HuffmanTree Huffman(MinHeap& H){ int i; ...原创 2020-03-31 18:16:38 · 108 阅读 · 0 评论 -
什么?不要告诉我你还不会用【堆】
文章目录堆?完全二叉树操作一箩筐insert 插入删除(重要)建立堆惯例,放个整的堆?完全二叉树我们在数据结构中所说的堆和操作系统中的是不一样的概念堆,就是,每个根结点都是最大最小值的完全二叉树这样说可能不好理解,简单来说,堆满足以下两个条件堆是一棵完全二叉树堆的每颗子树的最值都位于根结点其中,以最大值为根叫做最大堆,反之,最小堆以下,我们用数组实现对堆的一系列...原创 2020-03-30 11:39:46 · 93 阅读 · 1 评论 -
你要的二叉搜索树来了
文章目录什么是二叉,搜索树?操作一箩筐查找 FindNode插入 InsertNode删除 DeleteNode中序遍历,二叉搜索树的遍历搭档最后放个整的什么是二叉,搜索树?说起搜索,你可能立即想起各种查找算法,折半、索引、哈希??你有用过二叉树进行查找(搜索)吗?二叉搜索树相对于各种线性查找其实很好理解:你有一个根结点所有比它小的值放在左子树上所有比它大的值放在右子树上如此递...原创 2020-03-29 09:59:49 · 182 阅读 · 1 评论 -
二叉树的创建之静态链表实现
Tips静态链表即借助顺序存储结构使用链式关系进行数据的存储Code#include<iostream>using namespace std;#define MaxTree 20typedef struct TreeNode { char name; int left; int right;}Tree;Tree buildTree(...原创 2020-03-26 21:44:34 · 735 阅读 · 0 评论 -
二叉树应用举例
文章目录遍历叶子结点求二叉树的高度二元表达式树及其遍历两种遍历确定二叉树遍历叶子结点遍历之前加上对儿子的判断就好void PreOrderTraverse(BiTree T){ if (T) { if (!T->lchild && T->rchild) { cout << T->data &l...原创 2020-03-24 16:36:24 · 1729 阅读 · 0 评论 -
二叉树之层序遍历
Points层序遍历就是一层一层的遍历,从上往下,从左往右这里,本文使用队列进行层序遍历操作Code创建二叉树的过程用的是先序,以-1值代表结点为空#include<iostream>using namespace std;typedef struct BiTNode { int data; struct BiTNode* lchild, * ...原创 2020-03-24 16:11:58 · 155 阅读 · 0 评论 -
二叉树之先序中序后序遍历
Code创建二叉树的过程用的是先序,以-1值代表结点为空#include<iostream>using namespace std;typedef struct BiTNode { int data; struct BiTNode* lchild, * rchild;}BiTNode,*BiTree;void creatBiTree(BiTree&a...原创 2020-03-23 17:15:49 · 225 阅读 · 0 评论 -
重新理解递归与分治
递归递归实际上是通过栈的方式来实现,因此其效率低尾递归(即通过return来返回结果,如阶乘)可以通过循环实现非尾递归可以用模拟栈来实现实例:斐波那契数列的实现– 递归实现int fobinacci(int n) { if (n <= 1)return n; else { return (f(n - 1) + f(n - 2...原创 2020-03-23 09:57:35 · 122 阅读 · 0 评论 -
约瑟夫生死游戏:顺序+链式实现
约瑟夫生死游戏每30个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将全船一半乘客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第1个人数起,依次报数,数到第9人,便把他投入大海中,然后再从他的下一个人数起,数到第9人,再将他扔到大海中,如此循环地进行,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置。虽然顺序存储可以...原创 2020-03-21 17:32:06 · 964 阅读 · 0 评论 -
外部排序
应用场景步骤预处理nnn个数据分为最大mmm长的片段,共有n/mn/mn/m个片段普通处理根据上述方案直接选取n/mn/mn/m个片段,每个片段内部进行内部排序(即常见的排序方式)置换选择比较时间分析归并排序两路归并多路归并就是两路归并的拓展多阶段归并对于p个片段只需要p+1个磁带,关键:来回折腾+非均匀分解...原创 2020-03-19 20:55:35 · 122 阅读 · 0 评论 -
基数排序
多关键字排序低位优先多关键字排序(好实现)```cppvoid radixSort(int data[], int n){ int d = maxBit(data, n); int* tmp = new int[n];//临时 int* count = new int[10];//记数 int i, j, k; int radix = 1; ...原创 2020-03-17 11:08:57 · 98 阅读 · 0 评论 -
快速排序
描述Codevoid quickSort(int r[], int low, int high){ int i, j, temp; i = low; j = high; if (i >= j)return; int x = r[i]; while (i < j) { while ((i<j) && r[j]>x)--j; if ...原创 2020-03-17 09:02:28 · 94 阅读 · 0 评论 -
冒泡排序
冒泡排序void bubbleSort(int r[], int n){ int i, j, temp; bool flag = true; for (i = 0; i < n-1&&flag; ++i) { flag = false; for (j = 0; j < n-i-1; ++j) { if (r[j] > r[j + 1]) {...原创 2020-03-15 21:28:45 · 88 阅读 · 0 评论 -
选择排序
描述T(n)=O(n2)T(n)=O(n^2)T(n)=O(n2)S(n)=O(1)S(n)=O(1)S(n)=O(1)不稳定的排序Codevoid simpleSelectSort(int r[], int n){ int i, j, k; int temp; for (i = 0; i < n - 1; ++i) { k = i; for (j = i...转载 2020-03-15 20:48:07 · 87 阅读 · 0 评论 -
希尔排序
描述直接插入排序升级(利用增量)近似O(n)O(n)O(n),最坏O(n2)O(n^2)O(n2)Codevoid shellSort(int r[], int n, int d[], int t){ int i, j, k; k = 0; int temp; while (k < t) { for (i = d[k] + 1; i <= n; ++i) {...原创 2020-03-14 21:52:00 · 90 阅读 · 0 评论 -
简单插入排序
void insertSort(int* p,int n){ int i, j; for (i = 2; i <= n; i++) { p[0] = p[i]; j = i - 1; while (p[j] > p[i]) { p[j + 1] = p[j]; j--; } p[j + 1] = p[0]; }}原创 2020-03-10 21:50:24 · 72 阅读 · 0 评论 -
循环队列队满or队空混淆问题的三种解决策略
策略一:计数定义变量count记录队中元素,显然,count=queue.size时,队满count=0时,队空策略二:立Flag初始令flag为false,true表示入队,false表示出队若队满,则当前操作为入队;反之,为出队策略三:斩草除根令front或rear所指空间不存数据,则当进行入队操作使得front=rear时,操作无法进行,只有当队空时才会有front=rear...原创 2020-03-10 20:35:53 · 409 阅读 · 0 评论 -
图的深度优先搜索和广度优先搜索
图的遍历深度优先搜索/*图的遍历之深度优先搜索*/#include<stdio.h>int book[101],sum,n,e[101][101];void dfs(int cur);//cur为当前所在顶点编号 int main(){ int i,j; int m; printf("请输入顶点数n="); scanf("%d",&n); printf...原创 2020-02-10 20:36:48 · 967 阅读 · 0 评论