今天,主要学习了插入排序、二分查找以及字符型数组的一些操作,接下来主要介绍原理以及在实践中应用
插入排序
插入排序的思想主要就是:在有序的一组数列中找到一个合适的位置,将该值插入进去
如图,a是一个无序数组,正在进行的过程是将a[5]插入到b数组中,首先a[5]会和b[4]比大小,若a[5]值大,则直接插入到b[5]中,反之,将b[4]的值赋值给b[5],继续将a[5]的值跟b[3]作比较,以此类推。
#include<stdio.h>
int main(void)
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int i,j,t;
int len = sizeof(a) / sizeof(a[0]);
** for(i = 0;i < len;++i)
{
t = a[i];
while(i > 0 && a[i - 1] < t)
{
a[i] = a[i - 1];
--i;
}
a[i] = t;
** }
for(i = 0;i < len;++i)
{
printf("%d ",a[i]);
}
putchar('\n');
}
**标出来的那一段是插入排序算法的核心。
这是一个有顺序的数组,将它进行插入排序,让a数组最后逆序打出来。
二分查找
二分查找也叫做折半查找,但是他有一个前提,就是数据必须有序。
比如说如图所示,需要查找的数是3:
(1)首先取到中间值a[mid],判断3与a[mid]比大小,可以看出a[mid]大于3,故而令end = end - 1,mid = (begin + end )/ 2
(2)判断3与a[mid]比大小,此时a[mid] = 2,得到3大于a[mid],故令begin = mid + 1,mid = (begin + end )/ 2
(3)继续判断3与a[mid]比大小,此时a[mid] = 3,刚好等于3,就可以查找到该数据了。
#include<stdio.h>
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,10,55,77,99,888};
int len = sizeof(a) / sizeof(a[0]);
int begin = 0;
int end = len-1;
int mid,n;
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("找到了");
}else
{
printf("没找到");
}
return 0;
}
接下来,讲一下字符型数组的一些操作
字符数据:
unsigned char s[10]; //
unsigned char s[10] = {'h','e','l','l','o'};
其主要作用就说处理字符串数据。
如果将"hello"输入进去,可以表示为:
unsigned char s[10] = "hello";
unsigned char s[10] = {'h','e','l','l','o','\0'};
//'\0' 对于字符串来说,叫结束标志
unsigned char s[] = {'h','e','l','l','o','\0'};
unsigned char s[] = {'h','e','l','l','o'};
//表示的不一样,一个表示字符串(因为有'\0')
注意:
1.字符串 -- 更关注的是字符串整体,而不是单个字符
2.字符串的结束标志 比较重要 ,表示字符串结束
3.处理字符串时,常常使用结束标志作为判断
int puts(const char *s);
功能:
输出字符串
参数:
@s 字符串所在空间的首地址
返回值:
int 成功 >0
失败 -1
"hello" // '\0'
特点:
输出时,自动换行
char *gets(char *s);
功能:
输入字符串
参数:
@s 存放字符串一块内存空间
返回值:
表示的是 存储字符串那块空间首地址