一.数组的概述
1.数组是由一个或者若干个同类型的变量组成的集合,引用这些变量可用同一名字(数组名)
2.可实现对大批量数据的集中和统一处理
3.按照组织的形式可以分为一维数组和多维数组,按照数组内数据的类型又可以分为数值数组、字符数组、指针数组、结构体数组。
二.一维数组
(一).一维数组的定义和引用
- 定义:
2.数组的元素
int x[5];
数组的元素为:x[0], x[1], x[2], x[3], x[4]
是以 0 开始的索引,而不是1,所以不能使用数组元素x[5]
超限问题:C语言不对数组超限判断,由用户把握。
3.数组的引用
(二).一维数组在内存中的存放
注:一个整型数据占用4个字节的内存单元
(三).一维数组的初始化
(四).一维数组的应用举例
- 记录10个学生的考试成绩并求出平均成绩
#include<stdio.h>
int main()
{
int grade[10]={12,5,21,15,32,10,25,14,60,50};/*定义数组,记录10个学生的考试成绩*/
int total=O; /*定义变量,表示总成绩*/
int i;
float avg; /*定义变量,表示平均成绩*/
for(i=O;i<10;i++)/*循环累计总成绩*/
{
total+=grade[i];
}
avg=((float)total/10);/*计算平均成绩*/
printf("平均成绩是:%fln",avg);
return 0;
}
2.一 维数组的输入与输出
#include<stdio.h>
int main()
{
int i,a[10];
printf("输入10个数:");
for(i = 0;i < 10;i ++)
{
scanf("%d",a[i]);
}
printf("输出10个数:");
for(i = 0;i < 10;i ++)
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
(五).一维数组的经典算法
- 冒泡排序法
思路:将相邻的两个数比较,小的放前面,大的置后
总结:N个数字来进行排序——需要(N-1)轮,第i轮比较的次数为(N-i-1)次
示例代码:
#include<stdio.h>
int main()
{
int i,j,a[10],t;
printf("请输入10个数字作为排序前的数字:");
for(i = 0;i < 10;i ++)
{
scanf("%d",&a[i]);
}
printf("\n");
for(i = 0;i < 9;i ++)//共需要9轮比较
{
for(j = 0;j < 9 - i;j ++)//第i轮共需要9-i次比较
{
if(a[j] > a[j + 1])//如果前一个数比后一个数大,则对调两个元素
{
t = a[j];
a[j] = a[j + 1];//数组元素交换
a[j + 1] = t;
}
}
}
printf("\n排序后的数组为:");
for(i = 0;i < 10;i ++)
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
2.选择排序法
思路:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
#include<stdio.h>
int main()
{
int i,j,a[10],t;
printf("请输入10个数字作为排序前的数字:");
for(i = 0;i < 10;i ++)
{
scanf("%d",&a[i]);
}
printf("\n");
for(i = 0;i < 9;i ++)//外循环控制比较的轮数
{
for(j = j+1; j < 10; j ++)//内循环控制每轮比较的次数
{
if(a[i] > a[j])//如果序列中的其他元素比第一个元素小就交换
{
t = a[i];
a[i] = a[j];
a[j] = t;//数组元素交换
}
}
}
printf("\n排序后的数组为:");
for(i = 0;i < 10;i ++)
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
3.选择排序二(记下标排序法)
优点:可以减少数组元素的交换次数,即在内循环的两数比较时,用一个变量记住每次比较出的较小数的下标和位置,在内循环中不再进行交换操作,内循环的比较结束后,将此变量记住的下标的位置上的数与该序列的第一个数交换位置,每轮在剩下的数据序列里找最小的数的下标,与该序列的第一个数交换位置。以此类推,直到最后一轮时,剩下两个数组元素的比较。
示例代码:
#include "stdio. h"
int main( )
{
int i, j,a[10], t,k;
printf("\n排序前的数组为: ");
for(i=0;i<10;i++)
{
scanf("&d", &a[i]);
/*输入排序前的数组元素*/
}
printf("\n");
for(i=0;i < 9; i++)/* 外循环控制比较轮数 */
{
k = i;
/*设最小数的位置*/
for(j=i+1; j < 10; j++) /*内循环控制每轮 比较的次数 */
{
if(a[k] > a[j]) k = j; /*记下子序列中最小数的下标*/
}
a[i] ;
a[i] = a[k] ;
a[k] = t;
/*每轮循环数组元素仅交换一-次*/
}
printf("\n排序后的数组为: ");
for(i=0;i<10;i++)
{
printf(":5d", a[i]);
/*输出排序后的数组元素*/
}
printf("\n") ;
return 0;
}
4.数组元素的查找
(1).顺序查找
思路:拿给定的一个条件,依次顺序的查找比较,到序列中查找满足此条件的数据,直到查找成功,或全部查找一遍,都没有找到。
顺序查找采取的是逐个比较,一次比较不满足,只能排除一个元素,因此查找效率低,收敛速度慢,只适合查找表中数据量不大的情况。
一般使用for循环来逐个查找,if语句来判断条件是否成立。也可以用do……while语句来查找。
(2).折半查找
示例代码:
#define M 10
#include "stdio.h"
int main( )
{
int a[M] ={-1,0,5,18,23,56,90,107,111, 118};/*有序表*/
int n, low, mid, high, found;
low = 0; high =M-1;
/*设上界和下界*/
found = 0;
/*设标志变量*/
printf("Input a number to be searched:");
scanf("%d", &n);/*输入要查找的数*/
while(low <= high)
{
mid= (low + high)/ 2;/*取中间位置*/
if(n == a[mid])
{
found =1;
break;
/*找到数据,结束循环*/
}
else if(n > a[mid])
{
low = mid + 1;/*缩小到后一半,修改下界*/
}
else
{
high = mid - 1;/*缩小到前一半,修改上界*/
}
}
if (found == 1)
printf("The index of %d is %d \n",n,mid);/*输出找到的位置*/
else
printf("There is not %d\n",n);
return 0;
}
三.多维数组
此内容请到“C语言程序设计之数组,精华知识与基础知识汇总(下)”查看。