Algorithm&&Data Structure
文章平均质量分 59
dreamhunter_lan
经历了一些事情,不狂了(至少现在不狂),努力学习吧
展开
-
Insertion Sort
听说算法导论很牛,就下了个英文版的看看,第二章就介绍插入排序了,用Java实现了下,没实现一个就写下一个,方便以后复习,希望自己能坚持,挑些简单的看完,呵呵public class InsertionSort { public static void main(String[] args) { int[] array = {9, 3, 2, 4, 6, 8, 7};原创 2009-02-24 20:25:00 · 129 阅读 · 0 评论 -
删除一个字符串中重复的字符
<br />其实就是让"123456224437889"变为"123456789",设置一个变量last,始终指向没有重复字符的字符串的下一个位置,最后让s[last]=0,就搞到一个符合要求的C字符串了<br />void del_duplicated(char *s) { int n = strlen(s); if(n<=1) return; int i, j; int last = 1; //刚开始认为被处原创 2011-04-29 22:29:00 · 1985 阅读 · 0 评论 -
求逆序对个数(inversions)
<br />逆序对:设a是一个有n个不同元素的数组,,如果在i<j的情况下,a[i]>a[j],则(i, j)称为a的一个逆序对。<br />给定一个数组,求逆序对的个数,可以通过做循环,在n^2的时间内求出逆序对数目,但通常用归并排序在nlog(n)的时间内解决,只是当求出逆序对数目后,数组也已经排好序了,如果不想让原数组发生变化,可以把原数组拷贝到另一个数组,对新数组操作就好。整个过程一边排序一边数,递归到最深的地方如果有一个数,那么返回0,如果有两个数,看做有两个元素的子数组,两个子数组都已经排好序,原创 2011-04-28 20:48:00 · 1308 阅读 · 0 评论 -
由前序遍历和中序遍历结果构造二叉树
<br />前序遍历的第一个元素一定是根节点,构造出根节点,然后找到根节点在中序遍历中的位置,从而知道左右子树的都有哪些元素,递归进行处理,最后得到整棵二叉树。在一般情况下的时间复杂度是nlog(n),但是可以对中序遍历得到的字符串做哈希映射,key是字符,value是key在中序遍历中的位置,这样可以在常量时间内找到根节点的位置,可以达到log(n)的复杂度,最坏也是n的复杂度。<br />nlog(n)的情况(最坏为n^2):<br />int get_root_idx(char *preorder,原创 2011-04-27 11:59:00 · 659 阅读 · 0 评论 -
归并排序
<br />腾讯实习面试,被问到归并排序,很快地描述了一遍,面试官说:你写在纸上,假设我不会归并排序,解释给我听,让我明白,小弟一时懵了,因为紧张,我一边想怎么写,他又一边问其他问题,最后当然是杯具了,都怪自己不扎实,md,手写代码的能力更加差。<br /> <br />归并排序采用分治的策略,将n个元素分成个含n/2个元素的两个子序列,用归并排序对两个子序列递归地进行排序,最后合并两个已经排好序的两个子序列,得到一个有序的序列。合并的过程是:void merge(int *a, int l, int m,原创 2011-04-26 23:13:00 · 99 阅读 · 0 评论 -
二叉树的那些遍历(递归与非递归)
<br />参考着别人的写一些遍历的方式,其中后序只用一个栈的遍历还不能理解,先总结到一起去吧。<br />#include <stdio.h> #include <stdlib.h> #include<memory.h> #define MAX 100 //最多一百个节点 typedef struct btnode { char value; struct btnode *left; struct btnode *right; } btnode; btn原创 2011-04-24 22:36:00 · 200 阅读 · 0 评论 -
计数排序
<br />假设一个数组的元素大于等于0,有时可以考虑用计数排序。其实就是先对数个数组中每个数出现的次数做统计(计数),保存到一个数组,这个数组的大小可以用数组的最大值和最小值的差加一得到(max-min+1)。<br />void counting_sort(int *a, int n) { int i, j, min, max; min=max=a[0]; for(i=1; i<n; i++) { min = a[i]<min?a[i]:min原创 2011-04-23 20:41:00 · 166 阅读 · 0 评论 -
希尔排序
<br />希尔排序 有Donald Shell发明,每次,都使得部分数有序,最后整个数组有差不多有序的时候使用增量为1的插入排序(用了插入排序在有序情况下的时间复杂度是O(n)这个特点),至于希尔排序的分析真的很复杂,一般说它的时间复杂度是O(n(logn)^2)。其实就是对相隔为h的元素使用插入排序,最后h减到1,最后一次插入排序得到一个有序数组。<br />void shell_sort(int *a, int n) { int i, j, h; for(h=n/2; h>0;原创 2011-04-23 19:53:00 · 106 阅读 · 0 评论 -
求质数(:大于1的只能被1和它本身整除的自然数)
有时候就想记下一些白痴问题:public class Test { public static void main(String[] args) { for(int i = 1; i < 1000; i++) { if(isPrime(i)) { System.out.print(i + " "); } } } public static原创 2009-03-13 13:51:00 · 263 阅读 · 0 评论 -
理解红黑树
<br />关于红黑树,这个名字的来历就说多说了,是Guibas和Sedgewick也算是看了好多遍,但没有一次真正理解过,也没有去实现它。<br /> <br />红黑树满足二叉查找树的所有性质,不同的是它近似平衡,所有的操作都可以在O(lg(n))内完成,所以效率比较高,先列出红黑树的5条性质:<br />1、每个结点或者是红的,或者是黑的<br />2、根结点是黑的<br />3、每个叶子结点是黑的(这里的叶结点是外部结点,貌似只在统计黑结点个数的时候用)<br />4、如果一个结点是红的,那么它的两原创 2011-05-08 01:37:00 · 315 阅读 · 0 评论