
每周一道算法
后打开撒打发了
有些人注定要生活在彼岸 可以亲近可以爱怜 甚至可以穷尽一生去思念 只是无法触及 有些距离 注定不能跨越 只能俩俩相望 就像有些爱只能养在心里 长在眼中 不要捧在手里 放在身边 注定只能邂逅 无法遭遇
展开
-
算法----二分查找算法
二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5 2.寻找{6, 7, 8,原创 2015-08-31 00:49:57 · 1543 阅读 · 1 评论 -
算法----插入排序算法
插入排序:有n个数,第i个数前面都是有序的话,那么i插入到排好的系列中就非常简单,和前面的数一一比较就ok了,对于一个序列,那么从第二个数开始和前面数比较,排好前面2个数之后来把第三个数插入到前面2个数中就非常简单了,第四个数亦是如此,以此类推.....................仔细分析:工作机制是----假设元素3插入到1 4 5 6 7 8中去,那么用3与8比较,8比3大,那么8原创 2015-08-31 23:38:12 · 775 阅读 · 0 评论 -
算法----归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序的子操作思想:对两个有序的系列进行合并,合并的时候不断的对两个系列的第一个元素进行比较,把较小的那个移动到最前面成为了第一个元原创 2015-09-03 01:55:58 · 704 阅读 · 0 评论 -
算法----最大子数组和
这是一道很经典的算法题目,考的烂的不能再烂,还是有很多公司拿它来作为笔试题目,题目不难,这里我给出三种方法。问题描述:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8。方法一:暴力求解方法利用两原创 2015-09-04 01:13:02 · 5741 阅读 · 2 评论 -
算法----冒泡排序算法
冒泡排序算法算法思想:交换相邻的两个数,如果前面的数比后面的数大,那么就交换这两个数。(从小到大)举例: 假如有长度为n的数组,从前向后遍历这个数组,从第一个数开始用上面的思想比较交换,当遍历完这个数组后,这个数组中最大的数移动到了这个数组的最后面去了,第二次再从头遍历这个数组,这次遍历的数组长度就比第一次减少一个,因为最后一个数已近是最大的数了,不需要遍历,那么当第二次遍历完这个数组,第二大原创 2015-09-01 23:40:36 · 644 阅读 · 0 评论 -
算法----堆排序
首先了解一下堆: (1)堆是一棵完全二叉树(2)堆又分为大顶堆和小顶堆, 任何一非叶子节点i的关键字不能小于其左右孩子的节点的关键字.用公式表达大顶堆:key[i]>=key[2i+1]&&key[i]>=key[2i+2]用公式表达小顶堆:key[i]=key[i]=堆排序思想:(这里参考别人的博客,讲的非常好,借用一下http://blog.youkuaiyun.com/xiaoxi原创 2015-09-04 23:06:28 · 706 阅读 · 0 评论 -
算法----优先队列
队列:是一种满足先进先出(FIFO)的数据结构,数据从队列头部取出,新的数据从队列尾部插入,数据之间是平等的,不存在优先级的。 优先队列:优先级队列有两种,最大优先级队列和最小优先级队列,这两种类别分别可以用最大堆和最小堆实现。 优先队列支持的操作: INSERT(S,x):把元素x插入到集合S原创 2015-09-05 20:37:43 · 1013 阅读 · 0 评论 -
算法----快排算法
实际上快排算很好理解: 举个例子:有一个数组a,在数组中选择一个数x,然后把数组中所有小于等于x的数放到x左边,大于x的数放到右边,然后再利用分治递归思想把整个数组排成有序系列。其实现代码如下:#include using namespace std;int partition(int *a,int p,int r){ int i = p; for (int原创 2015-09-14 19:59:51 · 2123 阅读 · 0 评论