算法
文章平均质量分 69
niushitang
让编程成为一种兴趣爱好,让编程成为一种习惯,让编程成为生命中的一部分。
展开
-
回溯法之排列组合问题
回溯法又称试探法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点为“回溯点”。回溯与递归在实现排列组合问题时,总是要用到栈,因此当组合数比较大的时候效率不是很高。先介绍两种解决排列组合的特殊算法再介绍利用回溯法实现组合问题。特殊组合算法: 本算法的原创 2012-11-04 14:48:06 · 4204 阅读 · 2 评论 -
递归法解决Hanoi塔问题
解题思路:要移动n个盘子,可以定义一个函数:mov (n,a,b,c),其中字符变量a,b,c分别表示A,B,C三个塔,函数mov(n,a,b,c)表示将n个盘子从A塔(借助B塔)移动到C塔。则这个问题可以使用递归调用方法解决。在n>0的前提下,函数mov(n,a,b,c)通过下列两步实现移动1.mov(n-1,a,c,b)即将n-1个盘子从A塔(借助C塔)移动到B塔。目的是让A塔上的第n原创 2013-03-04 14:29:51 · 1447 阅读 · 0 评论 -
递归实现整数划分
正整数n的所有不同的划分中,将最大加数n1不大于的划分个数记作q(n,m)。可以建立如下递归函数#include int q(int n,int m){ if((n<1)||(m<1)) return 0; if((n==1)||(m==1)) return 1; if((n<m)) return q(n,n); if(n==m) return q(n,m-1)+1;原创 2013-02-25 21:06:41 · 582 阅读 · 0 评论 -
分治法之快速排序
分治法之快速排序快速排序法的基本思想为分治法,通过一次分割,将无序序列分为两部分,其中,前一部分的元素值均小于后一部分的元素值。然后每一部分再各自递归进行上述过程,直到每一部分的长度为1为止。我们知道排序的计算量通常是与序列长度的平方成正比,所以分治法将序列一分为二,再各自排序,将大大降低计算量,所以快速排序是一种高效的排序方法。对序列的分割过程如下:首先,在序列的第一个,中间一个以及最后原创 2012-11-02 21:51:37 · 7506 阅读 · 0 评论 -
分治法之二路归并排序
#include void Merge(int Array[],int TempArray[],int left,int right,int middle);void MergeSort(int Array[],int TempArray[],int left,int right){ int middle; if(left<right) //如果序列中只有0个或1个记录,就不用排序原创 2013-03-01 21:40:04 · 1449 阅读 · 0 评论 -
递归法实现全排列
//k表示数组中最开始的元素的编号,m表示数组中最后一个元素的编号void perm (int list[],int k,int m){ int i; int temp; if (k==m) {//只剩一个元素 for(i=0;i<=m;i++) printf("%d",list[i]); printf("\n"); } else {//还有多个元素,递归产生排列原创 2013-02-25 20:28:21 · 652 阅读 · 0 评论 -
分治法之归并排序(优化版)
#include #define THRESHOLD 28void ModMerge(int Array[],int TempArray[],int left,int right,int middle);void InsertSort(int Array[],int length);void ModMergeSort(int Array[], int TempArray[],int l原创 2013-03-02 11:34:54 · 2457 阅读 · 0 评论