关于算法,理解的不算很深刻,了解到好的算法不仅在时间的节约和空间的利用上,都最求最优的代码。
比较经典的算法就是各种排序、查找了,下面贴两个理解比较深的优化算法(二分查找在顺序二叉树那里写过了,不再重复,哈希查找的重点在于映射方法和冲突的解决)
1.上台阶问题,100个台阶,可以走1个2个和5个,有多少总方案,我自己优化的话,只能从暴力穷举→有限穷举→去除无效穷举这几个方向优化,不过最终的代码给了我很多的启发,找规律后再写代码会好的多,代码如下
#include<stdio.h>
int fun1(){
int count = 0;
int i,j,k;
for(i=0;i<=100;i++)
for(j=0;j<=100;j++)
for(k=0;k<=100;k++){
if(i+2*j+5*k==100)
count++;
}
printf("count in fun1 = %d
",count);
printf("fun1循环 %d 次
",i*j*k);
}
int fun2(){
int count = 0;
int i,j,k;
for(i=0;i<=20;i++)
for(j=0;j<=50;j++)
for(k=0;k<=100;k++){
if(5*i+2*j+k==100)
count++;
}
printf("count in fun2 = %d
",count);
printf("fun2循环 %d 次
",i*j*k);
}
int fun3(){
int count = 0;
int i,j;
for(i=0;i<=20;i++)
for(j=0;j<=50;j++)
{ if(5*i+2*j<=100)
count++;
}
printf("count in fun3 = %d
",count);
printf("fun3循环 %d 次
",i*j);
}
int fun4(){
int count = 0;
int i;
for(i=0;i<=100;i+=5)
count+=(100-i+2)/2;
printf("count in fun4 = %d
",count);
printf("fun4循环 %d 次
",i/5);
}
1.快速排序法:思想是将第一个数作为标的,从前和从后分别找大于和小于的书,区分放入位置,已到达将标的放到中间,两边的总体大小已经排序OK,进而递归调用继续排序。
#include<stdio.h>
int bubblesort(int a[],int size){
int i,j,k=0;
for(i=0;i<size-1;i++){
for(j=0;j<size-i-1;j++){
if(a[j]>a[j+1]){
a[j] += a[j+1];
a[j+1] = a[j]-a[j+1];
a[j] = a[j]-a[j+1];
k++;
}
}
}
return k;
}
void show(int a[],int size){
int i;
for(i=0;i<size;i++){
printf("%d ",a[i]);
}
printf("
");
}
static count =0;
int quicksort(int a[],int lift,int right){
if(lift>=right)
return -1;
int i = lift;
int j = right;
int temp = a[i];
while(i<j){
while(i<j && temp <= a[j]){
j--;
count++;
}
a[i]=a[j];
printf("________________
");
show(a,8);
while(i<j && a[i] <= temp)
{ i++;
count++;
}
a[j]=a[i];
printf("________________
");
show(a,8);
}
a[i]=temp;
printf("____________________________
");
show(a,8);
quicksort(a,lift,i-1);
quicksort(a,i+1,right);
return count;
}