为何写这个~
由于去年的一些变故,忘记了不少关于编程上的书面用语,因此找工做的过程就极其😅尴尬。。。算法
工做中常常用到一些问题,可是这些问题是由具备相同性质的小问题组合而成的,遇到这些问题时很天然的用了递归或循环的方式解决了问题。可是并不想不起来为何用这些方法或者说方式处理这些问题的。编程
最后痛定思痛😂,仍是决定看书来一点一点找回书面上的东西,省得再有种野生的感受。。数组
废话少说~ide
1.分解(divide),将问题划分为子问题,子问题和原问题的形式同样,只是规模更小。直到分解为足够小的子问题,至于分解用什么形式这些就很少说了。.net
2.解决(conquer),对足够小的问题进行适合适当的求解。code
3.合并(combine),将子问题的解依次合并为更大规模问题的解,直到合并结束。blog
例子:排序算法,归并排序
有一个数组,这个数组的元素排序为乱序的。
数组为O [13,2,4,3,14],不作更短或更长的缘由,更短体现不了这个思想,更长演示过程会麻烦。
按照流程排序
1.分解,将数组进行分解,分解策略为取半,即数组长度 除 2 (向上取整)分为更小规模的数组
递归
第一步,O [13,2,4,3,14]
分解分为 A [13, 2, 4]
和 B [3,14]
两个数组。
A B 数组长度均大于1,继续分解
此时结果为A[13, 2, 4]
、B [3, 14]
A
,B
数组长度大于1,继续分解。get
第二步,A[13, 2, 4]
分解为 A1 [13, 2]
、 A2 [4]
,B [3,14]
分解为B1 [3]
、B2 [14]
。
此时结果为A1 [13, 2]
、 A2 [4]
、 B1 [3]
、B2 [14]
A1
数组长度大于1,继续分解。
第三步,A1 [13, 2]
分解为A11 [13]
、 A12 [2]
。
此时结果为A11[13]
、A12 [2]
、A2[4]
、B1[3]
、B2 [4]
长度都等于1,分解中止
2.求解,由于只是排序,对结果不须要进行进一步的操做
3.合并,对分解的数组进行合并,从最下级开始
对最下级的A11[13]
,A12[2]
进行合并,获得A1[2, 13]
此时最下级不存在,上一级进行合并
对A1
,A2
进行合并,获得A[2, 4, 13]
,对B1
,B2
进行合并,获得B[3, 14]
对上一级进行合并
对A B 进行合并,获得A[2, 3, 4 , 13, 14]
此时无上一级,合并结束,返回A
C语言代码以下,或参考基础排序算法:
#include<stdio.h> #include<stdlib.h> #include<math.h> void merge(int arr[],int left,int mid,int right){ int *tmp_arr; int tmp_num = right - left + 1; tmp_arr = (int*)malloc(sizeof(int)*tmp_num); int i=left,j=mid+1,k=0; while(i<=mid && j<=right){ if(arr[i] < arr[j]){ tmp_arr[k++] = arr[i++]; }else{ tmp_arr[k++] = arr[j++]; } } while(i<=mid){ tmp_arr[k++] = arr[i++]; } while(j<=right){ tmp_arr[k++] = arr[j++]; } printf("sort after... left %d mid %d right %d\n",left,mid,right); for(i=left,j=0;i<=right;i++,j++){ arr[i] = tmp_arr[j]; printf("%d\n", arr[i]); } free(tmp_arr); } void sort_merge(int arr[],int left,int right){ if(left < right){ int mid; mid = floor((left+right)/2); printf("sort start... left %d mid %d right %d\n",left,mid,right); for(int i=left;i<=right;i++){ printf("%d\n", arr[i]); } sort_merge(arr,left,mid); sort_merge(arr,mid+1,right); merge(arr,left,mid,right); } } int main(){ int arr[5] = [13,2,4,3,14]; int length = sizeof(arr)/sizeof(arr[0]); printf("start: \n"); for(int k = 0 ;k<length;k++){ printf("%d\n", arr[k]); } sort_merge(arr,0,length - 1); printf("result:\n"); for(int i = 0 ;i<length;i++){ printf("%d\n", arr[i]); } return 0; }