algorithm
文章平均质量分 69
onlyou2030
内心仰望理想的人都在埋头苦干!
展开
-
最大子数组-分治算法
//最大子数组问题 #include using namespace std; #define MIN -1024 #define MAX 0x7fffff //找跨越重点的最大字数组 void FindMaxCrossingSubArray(int *arr, int low, int mid, int high, int &maxLeft, int &maxRight, int &c原创 2015-06-23 20:40:08 · 387 阅读 · 0 评论 -
KMP算法
KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白。这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法。 什么是原创 2015-10-12 19:07:32 · 328 阅读 · 0 评论 -
排序算法
1.快速排序 void SortByName(data mydata[],int left,int right) //left,right is index { if(left>=right) return; int first=left,last=right; data key; CopyData(key,mydata[first]); cout<<key原创 2015-08-30 20:12:49 · 277 阅读 · 0 评论 -
不用递归,使用栈实现快速排序(非常好理解)
#include #include using namespace std; void swap(int &a,int &b) { int temp=a; a=b; b=temp; } int partition(int arr[],int startIndex,int endIndex) { int pivot=arr[startIndex]; //枢轴 int to原创 2015-09-26 09:11:18 · 1526 阅读 · 0 评论 -
binary search
一.定义 二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中, 首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功; 否则,若key小,则在字典前半部分中继续进行二分法检索; 若key大,则在字典后半部分中继续进行二分法检索。 这样,经过一次比较就缩小一半的原创 2015-08-03 14:59:50 · 399 阅读 · 0 评论 -
红黑树的插入与删除
1.红黑树性质 1)每个结点要么是红的,要么是黑的。 2)根结点是黑的。 3)每个叶结点,即空结点(NIL)是黑的。 4)如果一个结点是红的,那么它的俩个儿子都是黑的。 5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。 2.红黑树的插入的几种情况(只有z为红且z的父为红才需要维护) 实现代码见RBTree原创 2015-07-21 21:05:37 · 256 阅读 · 0 评论 -
活动选择问题-动态规划/贪心算法
问题描述: 有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用。每个活动ai都有一个开始时间和结束时间,且 0 定义子集合Sij = { ak S : f i 假设S中的活动已按照结束时间递增的顺序排列,则Sij具有如下的性质: 1.当i 2.假设ak属于Sij,那么ak将把Sij分解成两个子问题,Sij包原创 2015-08-27 22:24:15 · 888 阅读 · 0 评论 -
红黑树的插入过程
题目:将关键字41,38,31,12,19,8连续地插入一棵初始为空的红黑树后,试画出该结果树。原创 2015-07-20 17:12:08 · 734 阅读 · 0 评论 -
求一个小于10的正整数的n次方,n很大
经常碰到一个小数的n次方的问题,结果数量级很大,超过double的范围,但是这种问题可以转为求一个小于10的正整数的n次方,然后在进行处理。 void power(int *a,int base,int n) { int j,k,i,set=0; for (k=base,i=0;i<MAX;i++,k/=10) a[i]=k%10; f原创 2015-08-27 19:03:50 · 1502 阅读 · 0 评论 -
快速排序C++
快速排序算法和合并排序算法一样,也是基于分治模式。对子数组A[p...r]快速排序的分治过程的三个步骤为: 分解:把数组A[p...r]分为A[p...q-1]与A[q+1...r]两部分,其中A[p...q-1]中的每个元素都小于等于A[q]而A[q+1...r]中的每个元素都大于等于A[q]; 解决:通过递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序; 合并原创 2015-07-04 21:37:21 · 264 阅读 · 0 评论 -
堆排序C++
用类来实现:#ifndef HEAP_H_ #define HEAP_H_ class Heap { private: int *A; int heapSize; //堆中元素的个数 int Parent(int i){ return (int)(i / 2); } //返回父节点的序号 int Left(int i){原创 2015-07-04 20:21:43 · 392 阅读 · 0 评论 -
计数排序和基数排序
基本思想:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置了。 //计数排序 #ifndef COUNTINGSORT_H_ #define COUNTINGSORT_H_ void CountingSort(int *A,int n, int *B, int k) //A为输入数组,n为A的长度,B为输出数组,A原创 2015-07-05 22:31:20 · 299 阅读 · 0 评论 -
分治法排序
#include using namespace std; #define MAX 0x7fffffff //arr[p..q]与arr[q+1..r]已经排好序,本代码将这两段排好的合起来 void Merge(int *arr, int p, int q, int r) { int n1 = q - p + 1; //arr[p..q]的长度为n1 int n2 = r -原创 2015-06-23 20:44:19 · 349 阅读 · 0 评论 -
数学上的一些算法
1.求两个数的最大公约数 可以使用辗转相除法,实现简单,效率高。 int gcd(int a, int b) { while (b != 0) { int t = a%b; a = b; b = t; } return a; } 假设r是a,b的最大公约数,则有(a,b)=(b,r),这就是原理。 2.求素数(质数)的算法 第一种暴力解法,时间复杂度:O(n^原创 2015-12-04 21:30:20 · 375 阅读 · 0 评论