数组
类型说明符 数组名[ 常量表达式 ];
例 float s[100]; 定义了一个浮点型数组 数组名为 s ,此数组有100个元素
[ ]括号内常量表达式应为非0无符号整形表达式
a[10]创造出的10个元素为a[0]-a[9]且元素类型与定义a[10]相同
数组存储具有1.单一性 2.有序性 3.连续性
数组存储方式是以首元素地址为相对地址 通过下标计算偏移量 进行偏移。
注意事项:1.使用数组时 下标不能超过定义数组的数。如果超过将会发生越界访问,造成严重大错误。
2.数组不能整体被引用,也不能被整体打印。
3.数组的数组名为数组的首元素地址。
4.定义的[]不是下标运算符,是类型说明符
可以使用{}来进行初始化
如果{}内没有全部初始化,剩下的数组元素全部补0。
如果初始化数组元素个数 小于 定义数组元素个数 否则将会程序报错 越界
可以使用int a[] = {1,2,3,4,5,6,7,8,9,0}来定义整形a数组,数组元素个数为大括号内赋值的个数。
可以用 sizeof(a) / sizeof(a[0]) 来计算数组内元素个数。
排序算法
1.选择排序
指在合适的位置上放上合适的数。
选择排序是循环里嵌套了一个循环,一共是两个循环,里面的循环有一个选择语句。
以i = 0 为例 里面的循环是将a[0]的值分别与a[1]~a[4]进行比较,如果a[0]的值大于a[1]~a[4]则将a[0]的值与之交换,一轮循环下来,a[0]里的值将会为最小值。
而外层循环是将a[0]跑完一轮内层循环后将a[0]递增1变为a[1],a[1]在进行内层循环,这样a[1]的值会为除a[0]外的最小值及次小值,外层循环一直到a[3]。两层循环跑完这样就从a[0]开始进行从小到大的排序。
选择循环的算法复杂度为 o(n)=n*n。
2.冒泡排序
是将数组中相邻的两个元素两两比较,小的放前,大的放后。
冒泡排序也是两个循环,外层循环 j 从函数长度 -1 即4开始,依次减1 直到等于0
内层循环 i 是从 0 开始 依次加 1 直到等于 j
例 从 j = 4 开始 i = 0 将 a[i]依次与a[i+1]进行比较,如果a[i] > a[i+1]则将 a[i]与a[i+1]的值进行对换,这样一轮下来,i从0到j=4,a[4]里将会装的是这个数组的最大值,第二轮i还是从0开始,j的值减1,i从0到3 到a[3]结束,内层循环结束a[3]里将会装次大值即第二大的数。外层循环结束,这个数组将会从a[4]开始向左,由大到小进行排序。
3.插入法排序
创立一个新数组b[ ] b数组的长度与 a[]相同, 将a[0] 放入 b[0] 接下来有两个循环
例 i = 1 开始 ,将a[1]的值赋给t,然后令j=i,如果b[0]的值大于t=a[1]则令b[1] = b[0] 令j减1 。 j = 0 内层循环条件为假跳出循环,令b[0]=a[1]。相当于a[1]的值如果小于a[0]则令a[1]=a[0]然后将a[1]的值给a[0]。外层循环一次,t = a[2] 如果 a[1] > a[2]则令a[2] = a[1],j减1 ,j为1 ,再进行判断a[0]是否大于 a[2]如果 a[0]>a[2] 则令a[1]=a[0] j再减1为0 跳出循环令 a[0]=a[2]。相当于是i从1开始将i = j ; a[j]与分别与a[j-1]进行比较如果a[j-1]的值大于a[i]则a[j]值=a[j-1] j减1 直到a[j-1]<a[j]则令a [j] = a[i]
这样a[i]从左边开始始终放在比左边大比右边小的位置。
二分查找法
原数组必须是有序数组
令数组第一个下标为 begin 最后一个下标为 end
mid = (begin + end) / 2。
将要查找的值a[n] 与 a[mid] 进行比较,如果 a[mid] >a[ n ] 则n在 mid 的左边 将 end下标更新为 原来的mid-1
如果 mid < n 则n在mid的右边 将end下标更新为 原来的mid+1
重新计算mid再次跟n比较直到begin <= end 位置 通过检测循环条件 begin <= end 是否为真来判断是否查找到n。
代码练习
定义一个数组a = {1,2,3,4,5,6,7,8,9,0}求出数组的最大值和次大值,并打印出最大值和次大值。
1 #include<stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a[] = {1,2,3,4,5,6,7,8,9,0};
6 int max = a[0], i = 1;
7 int len = sizeof(a) / sizeof(a[0]);
8
9 for(i; i < len; ++i)
10 {
11 if(max < a[i])
12 {
13 max = a[i];
14 }
15 }
16 printf("max = %d\n",max);
17 int second = 0x80000000;
18 for(i = 0; i < len; ++i)
19 {
20 if(second < a[i] && a[i] < max)
21 {
22 second = a[i];
23 }
24 }
25 printf("second = %d\n",second);
26
27 return 0;
28 }