今天主要就是把昨天未完成的两道题完成,下午学习了一系列的插入排序。
题目7:将字符串“We Are Family!”,去除空格后打印出来。(WeAreFamily!)
#include <stdio.h>
int main()
{
char a[100];
printf("输入字符串:\n");
fgets(a,100,stdin);
char* p;
char* t;
int count = 0;
int i = 0,j = 0;
p = a;
t = a;
while(*p != '\0')
{
count++;
p++;
}
for(i = 0;i <= count;i++)
{
if(*(t + i) != ' ')
{
*(t + (j++)) = *(t + i);
}
}
puts(t);
return 0;
}
题目8:输入一个字符串,判断其是否是回文。(回文:即正读和反读都一样,如abcba, abccba)
#include <stdio.h>
int main()
{
char a[100];
printf("输入字符串:\n");
fgets(a,100,stdin);
char* p = NULL;
char* t = NULL;
int i = 0;
int count = 0;
int flag;
p = a;
t = a;
while(*p != '\0' && *p != '\n')
{
count++;
p++;
}
printf("%d",count);
printf("\n");
while(i <= count / 2)
{
if(*(t + i) == *(p - i - 1))
{
flag = 0;
}
else
{
flag = 1;
}
i++;
}
if(flag == 0)
{
printf("是回文!");
}
else
{
printf("不是回文!");
}
printf("\n");
return 0;
}
时间复杂度
概念:就我今天看书所了解的,我认为时间复杂度就是一个算法的执行次数的一个大概值,为什么说是大概值?因为时间复杂度,是你的算法语句执行的次数,当你有几个循环嵌套的时候往往它的次数就会相乘,而且其大O(也就是复杂度的表示方法)只看最高次幂,其余省略。
举几个例子
int i;
for(i = 0;i < n;i++)
{
……
}
这样一段循环的时间复杂度为O(n),因为循环体中代码必须要执行n次。
int i,j;
for(i = 0;i < n;i++)
{
for(j = 0;j < n;j++)
{
……
}
}
这个就是O(n^2),这个程序它外部要循环n次,内部也要n次,这是属于平方阶的。
int count = 1;
while(count < n)
{
count = count * 2;
}
这个时间复杂度又是多少呢?由于每次count乘以2,就距离n更近。那么就是有多少个2相乘能够超过n,则会退出循环。求2的x次方等于n中x的值,即O(logn)。
排序
直接插入
#include <stdio.h>
int main()
{
int a[5];
int i; //定义一个循环变量
printf("输入数组元素:\n");
for(i = 0;i < 5;i++)
{
scanf("%d",&a[i]);
}
printf("\n");
int t;
int temp; //作为中间量
//从小到大
for(i = 1;i < 5;i++)
{
temp = a[i]; //设置插入值
t = i - 1; //记录下标
while((t >= 0) && (a[t] > temp))
{
a[t + 1] = a[t]; //将值插入
t--;
}
a[t + 1] = temp;
}
//输出数组
for(i = 0;i < 5;i++)
{
printf("%5d",a[i]);
}
printf("\n");
return 0;
}
折半插入排序
#include <stdio.h>
void CelerityRun(int left,int right,int array[])
{
int i,j;
int middle,temp;
i = left;
j = right;
middle = array[(left + right) / 2]; //求中间值
do
{
while((array[i] < middle) && (i < right)) //从左找小于中值的数
{
i++;
}
while((array[j] > middle) && (j > left)) //从右找大于中值的数
{
j--;
}
if(i <= j) //找到了一对值
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
while(i <= j); //如果两边的下标交错,就停止(完成一次)
//递归左半边
if(left < j)
{
CelerityRun(left,j,array);
}
//递归右半边
if(right > i)
{
CelerityRun(i,right,array);
}
}
int main()
{
int i;
int a[5];
printf("输入数组值:\n");
for(i = 0;i < 5;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
//从小到大
CelerityRun(0,4,a);
//输出数组
for(i = 0;i < 5;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
希尔排序
#include <stdio.h>
void ShellSort(int a[],int length)
{
int i,j;
int temp;
int increment = length;//increment是个增量
do
{
increment = increment / 3 + 1; //增量序列
for(i = increment;i < length;i++)
{
if(a[i] < a[i - increment])
{
temp = a[i]; //暂存
for(j = i - increment;j >= 0 && temp < a[j];j -= increment)
{
a[j + increment] = a[j]; //记录后移,查找插入位置
}
a[j + increment] = temp; //插入
}
}
}
while(increment > 1);
}
int main()
{
int a[5];
int i;
int length;
printf("输入数组:\n");
for(i = 0;i < 5;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("输入排序的个数:\n");
scanf("%d",&length);
//从小到大
ShellSort(a,length);
//输出数组
for(i = 0;i < 5;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}