算法
龙泉剑
keep moving
展开
-
排序算法之冒泡排序
算法思想:假设数组元素个数为N,那么经过N-1趟比较即可完成排序;每趟比较使数组中的一个数有序,在比较过程中只需两两比较尚未排序的数,故第i趟比较的次数为N-i-1; 算法优缺点:优点:算法实现起来比较简单,并且具有稳定性; 缺点:算法效率较低。 算法的C#实现: /// /// 冒泡排序。 /原创 2012-08-01 11:20:17 · 912 阅读 · 0 评论 -
C++ 实现大数相乘
如果这两个数比较小(即能用计算机的int、long类型表示,并且相乘后的结果任然能够表示)那么直接用计算机的乘法运算就可以了。这里的大数指的是用计算机的预设类型(int、long等)无法表示的数,如:111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111原创 2014-02-12 21:35:51 · 2483 阅读 · 0 评论 -
Java 分治法求数组的最小最大值
算法思想:如果数组中只有两个元素则较小的为最小值,较大的为最大值;否则根据下标将数组折半,比较左半部分的最小最大值和右半部分的最小最大值,较小的为最小值,较大的为最大值,此过程递归进行。Java实现:/** * 分治法求数组的最小最大值 * @author cht * */public class AlgoTest { public static void m原创 2013-12-31 15:51:44 · 3432 阅读 · 0 评论 -
二分查找递归与非递归实现
二分查找思想:将有序序列按照中间位置分为两半,如果中间元素与待查找元素相等,则返回;如果中间元素小于待查找元素,则在右半边查找;否则在左半边查找。Java递归实现:public static int find(int[] a,int begin,int end,int b){ if(begin==end){ if(a[begin]==b) retu原创 2013-12-16 21:05:34 · 853 阅读 · 0 评论 -
排序算法之堆排序
算法思想:堆的定义:source[i] 堆排序思想:(1)将待排序序列建成堆;(2)取堆的第一个元素,作为序列的最后一个元素, 并将剩下的元素重新建成堆;(3)重复第二步直到序列结束。C#实现: /// /// 堆排序原创 2012-09-25 10:48:29 · 673 阅读 · 0 评论 -
动态规划求两个字符串的连续最长公共子序列
设字符串A的长度为A.length,字符串B的长度为B.length。Temp[i][j],为状态数组,0考虑一般情况,如果A[i]==A[j],则Temp[i][j]=Temp[i-1][j-1]+1,否则Temp[i][j]=0,注:因为求的是连续最长公共字串所以此次为0。有了状态转移方程,直接写出代码就可以了。public static int longCom原创 2013-12-11 15:37:19 · 1482 阅读 · 0 评论 -
算法之求数组中最小的K个数
算法思想:维护一个由K个元素组成的大顶堆,依次将数组中的元素与堆顶元素比较,如果大于堆顶元素则舍弃,否则将元素放入堆顶并重新建堆。如果对堆的相关知识不清楚可参考:排序算法之堆排序java实现: public static int[] getMinElements(int[] a,int k){ int[] heap=new int[k]; //取数组的前原创 2013-12-04 13:47:28 · 1280 阅读 · 0 评论 -
算法之求数组中第i大的数
算法思想:将数组a[n]按照某一主元素进行划分,使数组左边的元素都小于主元素,数组右边的元素都大于主元素;假设主元素左边的元素个数为k,此时,判断k是否等于i,如果相等则返回,否则如果k大于i,则在数组左半边搜索第i大的元素,否则在数组右半边搜索第i-k大的元素。java代码如下: /** * 查找数组中第i大的元素。 * @param a 数组 * @para原创 2013-12-03 09:42:17 · 1885 阅读 · 0 评论 -
java 求两个整数的最大公约数和最小公倍数
求两个整数的最大公约数用辗转相除法比较简单。算法思想:找出两个数中较大的数,然后用较小的数除较大的数,如果余数不为0,则用余数去除上一步计算的除数,知道余数为0,这时除数就是最大公约数。这个算法比较简单明了,用JAVA实现如下: private static int maxGongYuShu(int a,int b){ if(a>b){原创 2013-11-08 15:07:36 · 2605 阅读 · 0 评论 -
合并两个有序数组
算法思想:每次从数组A或者数组B中取一个元素放入合并后的数组。假设:两个数组都是从小到大排列的。C#实现: /// /// 合并两个有序数组,数组都是从小到大排列的,合并后的数组也是从小到大排列 /// /// 数组 /// 数组 /// 合并后的数组 private int[] merge原创 2012-11-16 16:33:02 · 2001 阅读 · 1 评论 -
排序算法之计数排序
算法思想:在一个序列中如果有N个元素比当前元素小,那么在升序排列中,当前元素处于序列的第N+1个位置,计数排序可以直接计算出当前元素在有序序列中的位置,时间复杂度为O(n)算法适用范围:要求数组的元素为正整数,且有上界C#实现: /// /// 计数排序 /// /// 源数组 /// 数组中的元素的值的上界原创 2012-11-23 16:40:56 · 773 阅读 · 0 评论 -
求集合中M个元素构成的子集问题
算法思想: 集合中的某个元素,要么在子集中,要么不在子集中; 每次从集合中取一个元素,将该元素放在子集中,如果子集中的元素个数等于M, 则输出集合中的元素,否则继续取舍;将该元素从子集中删除,继续取舍直到集合尾部;C#实现:/// /// 求集合中的M个元素构成的子集原创 2012-10-25 10:28:39 · 3097 阅读 · 0 评论 -
求集合所有子集问题
算法思想:集合中的某个元素,要么在子集中,要么不在子集中; 每次从集合中取一个元素,将该元素放在子集中,继续取元素直到集合尾部; 将该元素从子集中删除,继续取元素知道集合尾部; 在到达集合尾部时,输出子集中的元素。C#实现:/// /// 求集合的所有子集原创 2012-10-25 10:20:17 · 1662 阅读 · 0 评论 -
排序算法之快速排序
算法思想:选定一个基准元素(通常选数列的第一个元素),通过一趟排序使左边的元素都比基准元素小,右边的元素都比基准元素大;然后再按上述方法对左边的元素和右边的元素递归的进行排序。C#实现:/// /// 快速排序 /// /// 待排序序列 /// 起始元素索引 /// 终止元素索引 privat原创 2012-09-25 14:51:34 · 606 阅读 · 0 评论 -
排序算法之归并排序(分治法排序)
算法思想:将一个数列划分为较小的部分,并使每一部分有序,然后将这些较小的有序部分合并。 下面实现,二路归并排序。C#实现: /// /// 二路归并排序(分治法排序) /// /// 源数组 /// 数组的起始元素下标0 /// 数组的最后一个元素的下标source.Le原创 2012-09-20 15:16:01 · 1374 阅读 · 0 评论 -
排序算法之插入排序
插入排序的思想:循环遍历每一个待排序元素,每次将待排序元素插入到有序的数列中。C#实现: /// /// 插入排序 /// /// 待排序的数列 private void insertSort(int[] source) { //循环数列,其中soure[i]为待排序的元素原创 2012-09-19 14:54:31 · 615 阅读 · 0 评论 -
排序算法之简单选择排序
算法思想:每次从无序序列中找到一个比有序序列中最小值小(或最大值大)的数,放到有序序列中。C#实现: /// /// 简单选择排序 /// /// 待排序序列 private void SelectSort(int[] source) { for (int i = 0; i < sour原创 2012-09-27 10:26:01 · 597 阅读 · 0 评论 -
C++分解质因数(获取整数的所有素因子)
算法思想:1、判断是否为素数,如果是,将该数加入素因子集合,返回。2、否则,从2到该数的平方根,依次将该数分解为两个数的乘积,分别对分解后的数进行判断。3、上述过程递归进行。C++实现:/* * 获取正整数的所有素因子 * n为正整数 * primes保存所有的素因子,如:8=2*2*2,12=2*2*3 */static void getPrime(int n, vector原创 2014-03-12 13:36:53 · 11921 阅读 · 0 评论