冒泡和选择哪个循环方法好?
通过CPU执行代码(指令)的数量=消耗时间
计算时间复杂度:O(n)计法? //大o计法
1 ?n-1? ? ? ? ? ? ? ? ? ?
2 ?n-2
3 ?n-3
...
n-1 1
1+2+3+...+n-1 //等差数列?
((n-1)(1+n-1))/2
(n-1)n ? /2
(n^2-n)/2
O(n) ?= n^2 //时间复杂度?
0 ?n-1
1 ?n-2?
2 ?n-3
思想:(再有序的数列中)找一个合适的位置,插入;就如同军训站队
#include <stdio.h>
int main(void)
{
int i = 0;
int j = 0;
int a[] = {5,1,7,2,3,8,4,6,9};
int len = sizeof(a)/sizeof(a[0]);
for (i = 0; i < len; ++i)
{
printf("%d ",a[i]);
}
putchar('\n');
int b[10] = {0};
for (i = 0; i < len; ++i)
{
int t = a[i];
j = i;
while (j > 0 && a[j-1] > t)
{
a[j] = a[j-1];
--j;
}
a[j] = t;
}
for (i = 0; i < len; ++i)
{
printf("%d ",a[i]);
}
putchar('\n');
? int? n;
? scanf(”%d“,&n)
? int? a[n];
如上所示,想要成立int a[n]不能被初始化。
二分查找(折半查找):
前提:数据必须有序? 所以要先排序在查找
如:
10000?
5000
2500
1250
625
312?
150
75
37
18
9
4
2
1
#include <stdio.h>
int main(void)
{
int a[] = {5,1,7,2,3,8,4,6,9};
int begin = 0;
int end = len-1;
int mid = 0;
printf("Input a num:");
int n = 0;
scanf("%d",&n);
while (begin <= end)
{
mid = (begin+end)/2;
if (a[mid] > n)
{
end = mid - 1;
}else if (a[mid] < n)
{
begin = mid + 1;
}else
{
break;
}
}
if (begin < end)
{
printf("%d is found!\n",n);
}else
{
printf("%d is not found!\n",n);
}
return 0;
unsigned char s[10];
unsigned char? s[10]={'h','d','x','t','g','o','v','p','w','f'};
最主要:”hello“就是字符串的表现形式,同时字符串的储存形式是按照字符数组的形式储存,对于字符串的储存最后会一 '\0' 结尾,对于字符串来说叫做结束标致。
注意:
1.字符串更关注的是字符串本身字符串整体,而不是单个单个字符
2.字符串结尾的标志比较重要,表示的是字符串结束
3.处理字符时,常常使用结束标志作为判断
功能是输出字符串
参数:
@a时字符的首地址
特点:使用这个函数输出使会自动和换行
功能:
使用这个函数是用来输入字符串
参数:
@a使存放字符串的大一块内存空间
返回值:
表示的是存储字符串的的那块空间首地址
字符串的长度是'\0'前面有效字符的个数
功能是实现字符串的拷贝如strcpy(char? a[i],char b[i]);就是将b[i]里的字符复制到a[i].
参数:
@dest? 目标字符串
@src? 源字符串
返回值:
成功返回的是dest的地址
失败NULL
1. 字符串拼接
#include <stdio.h>
int main(void)
{
int i=0;
int j=0; //定义三个变量对其初始化
int n=0;
char s1[20]="hello";
char s2[20]="world"; //对数组s1,s2初始化
while (s1[i]!='\0') //对数组中的每个字符进行遍历当遇到0的时候循环停止
{
++i; //循环一次记录一次 结果为数组s1的长度也是0的位置
}
while (s2[n]!='\0') //对数组中的每个字符进行遍历当遇到0的时候循环停止
{
++n; //循环一次记录一次 结果为数组s2的长度
}
for (j=0;j<i+n;++j) //j为数组s2的下标 对s2中的每一个字符进行遍历 直到小于i+n停止
{
s1[i+j]=s2[j]; //循环一次将s2中j所对应的字符付给s1中i+j的位置
}
puts(s1); //程序结束打印数组s1中的字符
return 0;
}
2、从终端输入一个n 将数组 int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9} 完成如下变化,并打印,操作方
n:1 9 1 2 3 4 5 6 7 8
n:2 8 9 1 2 3 4 5 6 7
n:3 7 8 9 1 2 3 4 5 6
#include <stdio.h>
int main(void)
{
#if 0
int n=0;
int i=0;
int j=0; //定义三个变量对其初始化
int a[9]={1,2,3,4,5,6,7,8,9}; //对数组a初始化
printf("Enter a number: \n");
scanf("%d",&n); //输入想要输入循环次数
for (j=0;j<n;++j) //循环次数条件
{
int i=8; //定义i=8时就是确定的没次循环的最后一位的值
int t = a[i]; //定义一个整型变量t将最后一位拿出来给到t
for (i=8;i>0;--i) //进入循环 i从下标为8的时候开始循环 当i循环到1循环结束
{
a[i]=a[i-1]; //以次将每一位往后偏移
}
a[0]=t; //将循环结束后最后拿出来的最后那一位放到开头
}
for (i=0;i<9;++i)
{
printf("a[%d]=%d ",i,a[i]); //用循环的方式打印出数组的每一项元素
}
putchar('\n'); //输出一个换行符
return 0;
}