用递归来写插入排序
对于分治法,我不是很懂,但是经过这次用递归来解决插入排序让我大致了解这类算法的思想。
通过不断分解问题的大小,直至最小。
我觉得这类算法比较适合有规律的问题,就比如插入算法,每一次的操作的是相同的,插入也是一个一个的来插入,那么这就是典型的分治法策略了。
贴上代码:
#include<stdio.h>
void charusort(int number[],int p,int r);
void charu(int number[],int p,int r);
int main(void) {
int number[11]={0,3,5,4,1,2,7,8,6,10,9};
charusort(number,1,10);
/*for(int i=1;i<=10;i++) {
printf("%d ",number[i]);
}*/
}
void charusort(int number[],int p,int r) {
if(p<r) {
r=r-1;
charusort(number,p,r);
charu(number,p,r);
}
}
void charu(int number[],int p,int r) {
for(int i=p+1;i<=r+1;i++) {
int key=number[i];
int j=i-1;
while(key<number[j]&&j>=1) {
number[j+1]=number[j];
j--;
}
number[j+1]=key;
}
}
按照算法导论上时间复杂度递归式的写法:
- 分解问题过程中消耗的时间T(n-1)(即上面代码 中charusort(number,p,r)函数所消耗的时间);,n-1个数参与的插入排序,用递归进行分解也采用的n-1次
- 每个子问题的时间复杂度T(n^2)(即上面代码中charu(number,p,r)函数所消耗的时间
T=T(n-1)+T(n^2)