
algorithm
蔡金平
目前正在北邮读研主要工作方向是软件无线电对通信系统嵌入式以及互联网感兴趣有志同道合的欢迎一起探讨
展开
-
插入排序
/*file: insert_sort.cpp*/#include#define N 10void main(){ int data[N]; int i,j,key; printf("Please input data:\n"); for(i=0;i<N;i++) scanf("%d",&data[i]); for(i=1;i<N;i++) { key = data原创 2013-05-07 13:17:42 · 823 阅读 · 0 评论 -
分治算法四(查找第K小元素)
1.问题描述对于一个非有序的数组A[start..end],求数组中第k小的元素2.解决思路最直观的的方式,先对数组排序,复杂度为o(nlgn),但是这样复杂度太大,可以利用快速排序的思路,解决这个问题,并且复杂度为o(n)。关键在于划分只一个部分,我们知道快速排序选择一个pivot对数组进行划分,左边小于pivot,右边大于等于pivot,所以我们计算左边小于pi原创 2013-05-12 16:32:22 · 3523 阅读 · 0 评论 -
分治算法三(随机化快速排序)
1、快速排序对于输入数据的顺序比较敏感。主要在于每次划分对主元的选择。基本的快速排序选取第一个元素作为主元。这样在数组已经有序的情况下,每次划分将得到最坏的结果。这个时候,时间复杂度将会退化到O(n^2)。2、一种比较常见的优化方法是随机化算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是取决于随机函数随机数的选取。实际上,随机化快速原创 2013-05-11 18:03:35 · 1577 阅读 · 0 评论 -
分治算法二(快速排序)
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。(选择方式可以不同)2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。/原创 2013-05-11 17:18:17 · 788 阅读 · 0 评论 -
北大ACM题目分类
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/pingnanlee/archive/2009/05/20/4204260.aspx首先推荐大家一些非常简单的题,特别适合没有算法基础的新手做(需要C语言基础)。 1000 1001 1002 1003 1004 1005 1006 1007 1008 1012 1013 1017 1019 1转载 2013-05-12 23:08:39 · 1048 阅读 · 0 评论 -
分治算法一(归并排序)
/* file: merge_sort *//* 1、if n = 1 done *//* 2、divide:A[1..n/2] and A[n/2+1..n] *//* 3、merge 2 sorted subarray */#include#include /*===================================== Arra原创 2013-05-10 22:15:03 · 801 阅读 · 0 评论 -
分治算法五(最近点对---杭电OJ 1007 Quoit Design)
1、问题描述杭电OJ 1007链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007即给定坐标系上N个点,找到距离最短的两个点。2、思路解析----->如果直接利用两两点比较的话,复杂度太高,为O(n^2),会导致超时----->简化问题:考虑一维数轴上点的情况,如果对这些点排序O(nlgn),那么最后只需要用O(n)时间就可以找原创 2013-05-13 19:56:32 · 1386 阅读 · 0 评论 -
两个精巧的算法
1、计算一个二进制数中1的个数如给定一个整型数 x = 10,它的二进制表达式是(1010)B,题意就是计算出x的二进制表示中一的个数是2。分析如下:如果将x转化为二进制,就可以计算出1的个数了,此时复杂度是o(log n)的,复杂度还可以。int func(int x){ int count = 0; while(x){ if(x%2 == 1) count++; x原创 2014-03-03 14:53:38 · 1395 阅读 · 0 评论