【算法理论】
CPP攻城师
You got a dream, you gotta protect it. People cant do something themselves,they wanna tell you you cant do it.If you want something, go get it.
展开
-
C++ 堆排序
首先让我们一起了解一下堆的定义。最大堆:后者任一非终端节点的关键字均大于或等于它的左、右孩子的关键字,此时位于堆顶的节点的关键字是整个序列中最大的。(堆的定义是递归的)#include using namespace std;void sift(int r[], int k, int m){//要筛选的节点编号为k,堆中最后一个节点为m int i, j, temp;原创 2012-12-14 10:28:12 · 6274 阅读 · 0 评论 -
四人过桥
微软的过桥问题说的是4个人在晚上过一座小桥,过桥时必须要用到手电筒,只有一枚手电筒,每次最多只可以有两人通过, 4个人的过桥速度分别为1分钟、2分钟、5分钟、10分钟,试问最少需要多长时间4人才可以全部通过小桥?这个问题如果用图论来建模的话,就可以以4个人在桥两端的状态来作为节点来构造一个有向图,如下图所示,以已经过桥了的人的状态作为图的节点,初始时没有人过桥,所以以空表示,第一轮有两个人转载 2013-08-07 00:44:16 · 1237 阅读 · 0 评论 -
理解A*寻路算法具体过程
理解A*寻路算法具体过程 这两天研究了下 A* 寻路算法, 主要学习了这篇文章, 但这篇翻译得不是很好, 我花了很久才看明白文章中的各种指代. 特写此篇博客用来总结, 并写了寻路算法的代码, 觉得有用的同学可以看看. 另外因为图片制作起来比较麻烦, 所以我用的是原文里的图片. 当然寻路算法不止 A* 这一种, 还有递归, 非递归, 广度优转载 2013-08-07 12:00:55 · 1003 阅读 · 0 评论 -
C语言实现快速排序
#include void swap(int v[], int i, int j){ int temp; //交换i,j位置的元素 temp = v[i]; v[i] = v[j]; v[j] = temp;}void quicksort(int v[], int left, int right){ int i, last;原创 2012-12-13 10:47:51 · 954 阅读 · 0 评论 -
快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法过程:设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数转载 2013-08-07 11:00:23 · 905 阅读 · 0 评论 -
C++ 顺序表的查找
#include using namespace std;int SeqSearch(int r[], int n, int k)//r[1]~r[n]存放元素{ int i = n; r[0] = k; while(r[i]!=k) { i--; } return i;}int main(){ int r[原创 2012-12-16 22:18:34 · 2569 阅读 · 0 评论 -
C++ 归并排序 (升序)
基本思想:将一个具有n个待排序记录的序列看成是n个长度为1的有序序列,然后进行两两归并,得到n/2个长度为2的有序序列,再进行两两归并,得到n/4个长度为4的有序序列,……,直至得到一个长度为n的有序序列为止。在归并过程中,可能会破坏原来的有序序列,所以,将归并的结果存入另外一个数组中。 #include using namespace std;void Merge(i原创 2012-12-15 18:25:45 · 1701 阅读 · 0 评论 -
C++ 希尔排序
基本思想:将整个待排序记录分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列中的记录基本有序时,对全体记录进行直接插入排序。子序列不是被简单的“逐段分割”,而是将相距某个“增量”的记录组成一个子序列,希尔排序开始时增量较大,每个子序列中的记录个数较少,从而排序速度较快;当增量较小时,虽然每个子序列中记录个数较多,但整个序列已基本有序,排序速度也较快。#include原创 2012-12-14 16:40:04 · 1216 阅读 · 0 评论 -
C++ 冒泡排序
基本思想:两两比较相邻的关键码,如果反序则交换(冒泡排序是一种稳定的算法),直到没有反序的记录为止。解决方法:两两比较的时候较大的记录数组的后方移动,经过一次冒泡后,数组中的所有元素都已经被比较了一遍。所以冒出的第一个泡一定是数组中最大的一个记录,同时用一个标志位exchange来记录最后发生交换的位置,作为下一次扫描时的终点。#include using namespace原创 2012-12-14 17:58:15 · 2236 阅读 · 0 评论 -
C++ 直接插入排序
基本思想:每次取无序序列中的第一个元素,用来和有序序列中的元素比较,找到合适的插入位置。一个数组中将第i个元素放到数组的0号位置,起到暂存的记录的作用,同时又由于直接插入排序是一种稳定的排序算法,0号位有可以起到一个标记的作用,当比较到0号位置时,一定可以找到插入的位置。插入排序是,从无序序列中选取第一个元素,和有序序列的最后一个元素比较,然后依次往前,逐个比较,如果r[j原创 2012-12-14 14:25:15 · 3470 阅读 · 0 评论 -
C++ 简单选择排序
基本思想:第i趟在n-i+1(i=1,2,....,n-1)个记录中选取关键码最小的记录作为有序序列的第i个记录。需要解决的问题?(1)如何在待排序序列中选出关键码最小的记录?(2)如何确定待排序序列中最小的记录在有序序列中的位置?简单选择排序实质是一种交换排序,从待排序序列中选取最小的记录与待排序序列中的最后一个元素进行交换,从而实现一个自增长序列的排序。原创 2012-12-13 13:30:27 · 8565 阅读 · 0 评论