
算法数据结构
爱做的小乌龟
但行好事,莫问前程
展开
-
冒泡排序
冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把他们交换过来。 每一趟只能确定一个数归位。,即第一趟只能确定将末位上的数归位。 冒泡排序的核心部分是双重嵌套循环,时间复杂度为0(N*N),复杂度很高,所以有人做了评价:冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的。//冒泡排序public class BubbleSort {原创 2016-11-20 13:12:00 · 326 阅读 · 0 评论 -
简单深度优先搜索
深度优先遍历过程。 从一个点向下试,直到试不下去为止。 图与树不同,树从一个根开始,向下走,一定有走不下去的时候,而图存在环,为此,需要记录每一个点是否被遍历过了,如果被遍历过,在下面的遍历中就不需要走了,当没有相邻节点时,就退回。假设迷宫有5行4列 二维数组0表示空地 1表示障碍物,入口为0,0 步数最少到达3,2//深度优先搜索迷宫问题public class Dfs {原创 2016-11-20 20:30:03 · 286 阅读 · 0 评论 -
简单广度优先搜索
一次将一个节点的所有相邻节点都遍历,然后再依次遍历相邻节点的相邻节点,依此类推。 使用队列作为辅助的数据结构。迷宫问题,import java.util.LinkedList;import java.util.Queue;//广度优先搜索class MAN{ int x;//坐标 int y;//坐标 int s;//步数 MAN(int x,int y,原创 2016-11-21 10:37:18 · 248 阅读 · 0 评论 -
Floyd-Warshall
FloydWarshall 算法用于求解任意两个点之间的最短路径问题,被称为“多源最短路径问题”他的时间复杂度为O(N*N*N)。实现起来非常容易。 使用时搞清楚三次循环分别代表什么。public class FloydWarshall { public void floydwarshall(int e[][]){ for(int k=0;k<e.length;k++)原创 2016-11-21 17:07:45 · 261 阅读 · 0 评论 -
Dijkstra算法
算法的基本思想是:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。 基本步骤如下: 1.将所有的顶点分为两部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q。最开始,已知最短路径的顶点集合P中只有源点一个一个顶点。我们这里用一个book数组来记录哪些点在集合P中。例如对于某个顶点i,如果book[i]为1,则表示这个顶点在集合P中,如果book原创 2016-11-21 19:51:02 · 403 阅读 · 0 评论 -
堆
堆是什么,是一种特殊的完全二叉树, 所有的父节点比子节点小的堆称为最小堆,所有的父节点比子节点大的堆称为最大堆。原创 2016-11-21 23:00:53 · 282 阅读 · 0 评论 -
选择排序
时间复杂度O(N*N) 选择排序。 从第0个元素开始,往后查找一个比0号位小的元素,与0交换位置。 依此类推。public class SelectionSort { public void selectionSort(int arr[]) { for(int i=0;i<arr.length;i++) { int mixI原创 2016-11-21 23:45:57 · 214 阅读 · 0 评论 -
插入排序
过程插入排序类似于我们排序扑克牌的过程,拿一张牌,插入到指定位置。例如如下数组。8,6,2,3,1,5,7,4我们假设8已经排好序,第一步是将6这个元素与8进行比较,发现6比8小,所以将6与8交换位置,此时6为最小的元素,第二步将2与8比较,2与6比较,发现此时2最小,所以此时2分别与8和6进行一次交换位置的操作,依次类推,直到走完为止。代码//插入排序public void insertSort原创 2016-11-24 21:09:45 · 355 阅读 · 0 评论 -
归并排序
过程归并排序分为分和和的过程,前者将数组分为一个一个的元素,后者将数组组合成有序的,有与分的过程做多有log(n)行,每行有N个元素,所以其的山建复杂度为O(N*logN),由于归并的过程需要借助大小为N的数组,所以其空间复杂度为O(n)。 代码//归并排序public class Merge { public int[] mergesort(int a[],int m,int n)原创 2016-11-24 21:39:00 · 307 阅读 · 0 评论