1.一维数组
(1)定义
类型说明符 数组名 [整型表达式]
注:类型说明符是除(void)以外的类型;
c99之后可以这样写
int n = 10;
int a[n]; //不能初始化
(2)性质
单一性:数组每个元素所占用的空间大小都相同。
连续性:数组中每个元素所占用的空间都是连续的
有序性:数组元素在内存中严格按照声明的顺序连续存储
(3)注意事项
①数组不得被整体赋值。
int a[5] = 3 //错误
int a[5] = {0,1,2,3,4} //正确
②数组不得整体被引用。(数组的数组名代表的是数组的首元素的地址)
③数组的越界访问
int a[5] = {0,1,2,3,4};
a[6] = 10; //越界访问
(4)例题(算法思想)
①计算一个数组能被3整除的数
#include <stdio.h>
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i;
int len = sizeof(a) / sizeof(a[0]);
for(i = 0;i <= len;++i)
{
if(i % 3 == 0 && i >= 3)
{
printf("%d\n", a[i]);
}
}
return 0;
}
②计算一个数组能被3整除的数的个数
#include <stdio.h>
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i;
int len = sizeof(a) / sizeof(a[0]);
int counter = 0;
for(i = 0;i < len;++i)
{
if(a[i] % 3 == 0)
{
counter++;
}
}
printf("%d\n", counter);
return 0;
}
③求一个数组所有元素的和
#include <stdio.h>
int main(void)
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
int i;
int len = sizeof(a) / sizeof(a[0]);
int sum = 0;
for (i = 0;i < len; ++i)
{
sum +=a[i];
}
printf("%d\n", sum);
return 0;
}
④求一个数列的最大值和次大值
#include <stdio.h>
#include <limits.h>
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9};
int i;
int len = sizeof(a) / sizeof(a[0]);
int max = a[0];
int max1 = INT_MIN;
for(i = 1;i < len;++i)
{
if(max < a[i])
{
max = a[i];
}
}
for(i = 1;i < len;++i)
{
if(max1 < a[i] && a[i] !=max)
{
max1 = a[i];
}
}
printf("%d\n",max);
printf("%d\n", max1);
return 0;
}
⑤对数组里面的数进行逆序排序
#include <stdio.h>
int main(void)
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
int i;
int len = sizeof(a) / sizeof(a[0]);
for(i = 0;i < len / 2;++i)
{
int t;
t = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = t;
}
for(i = 0;i < len;++i)
{
printf("%d\n", a[i]);
}
return 0;
}
⑥选择排序(算法复杂度O(n)= n^2)
选择排序:在合适的位置放合适的数。(把第一个和别的依次比较,再把第二个和后面的一次比较,依此类推)
#include <stdio.h>
int main(void)
{
int a[] = { 5, 8 ,15 ,30 ,1 ,56, 48};
int i, j;
int len = sizeof(a) / sizeof(a[0]);
for(i = 0;i < len - 1;++i)
{
for(j = i + 1;j < len;++j)
{
int t;
if(a[i] > a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
for(i = 0;i < len;++i)
{
printf("%d\n",a[i]);
}
return 0;
}
⑦冒泡排序(算法复杂度O(n)= n^2)
冒泡排序:两个相邻元素两两比较,小的在前,大的在后。
#include<stdio.h>
int main(void)
{
int a[]={1,5,7,23,21,68,51,42,99};
int i, j;
int len = sizeof(a) / sizeof(a[0]);
for(j = len - 1;j > 0;--j)
{
for(i = 0;i < j;++i)
{
if(a[i] > a[i + 1])
{
int t;
t = a[i];
a[i] = a[i +1];
a[i + 1] = t;
}
}
}
for(i = 0;i < len;++i)
{
printf("%d\n",a[i]);
}
return 0;
}
⑧原地插入排序(算法复杂度O(n)= n^2)
#include<stdio.h>
int main(void)
{
int a[] = {1,6,52,31,48,65,98,23,11};
int i;
int len = sizeof(a) / sizeof(a[0]);
for(i = 1;i < len;++i)
{
int t = a[i];
int 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\n", a[i]);
}
return 0;
}
说明:
int len = sizeof(a) / sizeof(a[0]); 表示确实数组的长度