一.概述
1.什么是算法
算法具有五个重要特征:
(1)有限性
(2)确定性
(3)可行性
(4)输入性
(5)输出性
例1.1 求一个字符串中首先出现三次的英文字符
//求一个字符串中首先出现三次的英文字符
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
#define MAX 256 //ASCALL码 0-255
char solve(char *str)
{
int c[MAX],i;
for(i=0;i<MAX;i++)
c[i]=0;
for(i=0;str[i]!='\0';i++)
{
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
{
c[str[i]]++;
if(c[str[i]]==3)
{
return str[i];
}
}
//return 0;
}
}
int main()
{
char str[MAXLEN];
gets(str);
printf("%c",solve(str));
return 0;
}
2.算法时间复杂度分析
1.算法的最好、最坏、平均情况
例1.2采用顺序查找方法,在长度为n的一维实型数组a[0…n-1]中查找值为x的元素
代码如下:
int Find(double a[],int n,double x)
{
int i=0;
while(i<n)
{
if(a[i]==x) break;
i++;
}
if(i<n) return 1;
else return 0;
}
成功查找到x元素的最好、最坏和平均时间复杂度:
(1)最好的情况是a[0]等于x,所以仅执行一次 T(n)=O(1)
(2)最坏的情况是a[n]等于x,所以执行了n次 T(n)=O(n)
(3)平均时间复杂度需要将每种情况加起来计算 A(n)=1+2+3+…+n=(n+1)/2=O(n)
2.递归算法的时间复杂度分析
例1.3二路归并排序
void mergesort(int a[],itn i,int j)
{
int mid;
if(i!=j)
{
mid=(i+j)/2;
mergesort(a,i,mid);
mergesort(a,mid+1,j);
merge(a,i,j,mid);
}
}
解:设mergesort(a,0,n-1)的执行时间为T(n),则:
T(n)=O(1) 当n=1时
T(n)=2T(n/2)+O(n) 当n>1时
所以:
T(n)=O(nlog2(n))