各种算法
文章平均质量分 67
二零一四Tenc
这个作者很懒,什么都没留下…
展开
-
KMP算法之我见
这一篇用来记录KMP算法(看过一篇帖子说这是”看毛片”算法,邪恶了,呵呵) 一、首先我们要掌握BF(Brute-Force)算法,基本思想总结: 主串 s = a b a c a b a b i = 3 模式串t = a b a b a j = 3 i=3, j=3失配时,j要返回为0,i则要从上次开始处往后移一个位置开始重新匹配。 算法思想很容易理原创 2013-05-30 21:23:05 · 985 阅读 · 1 评论 -
插入排序
虽然网上有很多排序算法的博客,而且都写得特别好,但是我觉得有自己的思想,才能领悟这些算法的精髓。 说到底,懂得还是懂,不懂还要努力呗,但是插入排序在我参加的两场暑期实习生招聘中都考到了,其中一场是企鹅的(被它鄙视了,%>_ 我喜欢把这个算法叫“斗地主算法”,场景是这样,你拿了一手牌,乱序的,你需要安从小到大来排,你会怎么办呢?如果是我,我会从左到右,一次拿出一张牌,往左“比较插入” 上图原创 2013-06-01 11:51:38 · 688 阅读 · 0 评论 -
冒泡排序
冒泡排序是很经典的排序算法,记得大一的时候我去参加我们学校的linux兴趣小组,那个时候简直太菜了,人家让我写,我写了半天写不出来,真是o(╯□╰)o 我觉得要掌握冒泡排序及其算法,需要记住两点: 1、 外层循环用来控制比较次数,如n个数,则需要比较n-1 2、 内层循环用来控制相邻两数的比较 void Bubble_sort(int a[], int原创 2013-06-01 12:30:49 · 667 阅读 · 0 评论 -
归并排序的实现
归并排序的时间复杂度和快排还有堆排序是一样的,归并排序利用了分治的思想,它的核心就是将两个有序的数组合并,那么我们怎么得到这两个有序的数组呢,就是将这两个数组再分为小的数组,由小的数组合并而成,是不是有种递归的赶脚?对了,归并就是,递归+合并 算法的框架像这样的: void merge_sort(int a[], int l, int r, int temp[]) { if(l < r原创 2013-09-06 10:25:35 · 1000 阅读 · 0 评论 -
二分法查找的实现
二分法查找的前提是数据是有序的,时间复杂度是O(log2n) 没有什么难点,写的太多了,直接上代码: #include int BSearch(int a[], int x, int low, int high) { if(low < high) return -1; int mid = (low+high)/2; if(x==a[mid]原创 2013-09-09 13:45:47 · 784 阅读 · 0 评论 -
堆排序的实现
堆排序是利用了一种数据结构叫做二叉堆,二叉堆是这样定义的: 二叉堆是一种特殊的堆,二叉堆是完全二元树或者是近似完全二元树,有最小堆和最大堆 特点: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。 利用堆排序数据的存储方式如下: 以下是我的代码实现: /*************原创 2013-09-04 21:21:06 · 921 阅读 · 0 评论 -
选择排序的实现
选择排序很简单,基本思想如下: 从待排序的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第一个记录交换位置;然后从不包括第一个位置上的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第二个记录交换位置;如此重复,直到序列中只剩下一个记录为止。 代码实现如下: #include #define ARRAYSIZE 4 void swap(int *m, int *n原创 2013-09-05 13:02:19 · 723 阅读 · 0 评论