C语言期末复习-数组
定义数组
定义一维数组:
int a[10]; //常规定义,类型 数组名【数组数量(定位序号从0开始到N-1)】
int b[N]; //使用宏定义定义数组
int c[N]={0}; //数组初始化为0
memset(a,0,sizeof(a)); //使用memset将a数组内容初始化为0 需要调用string.h库
int d[3]={23,22,21}; //初始化数组内的元素,花括号里的元素个数不能多余数组指定的个数,但是可以少
memcpy(b,c,sizeof(c)); //通过memcpy函数将数组c的值赋值给数组b,要求数组b和数组c的长度应相同
定义二维数组:
int e[3][4]; //定义数组大小为三行四列的二维数组 【二维数组的存储顺序为按行存储,先行后列】
int f[][4]={1,2,3,4,5,6,7,8}; //定义二维数组给出数组的全部元素后,元素行数可以省略
int h[][4]={{1,2,3},{4,5},6}; //元素可以少于数组定义的个数
//该数组输出为
// 1 2 3 0
// 4 5 0 0
// 6 0 0 0
定义三维数组
int g[2][3][4]; //定义数组大小为2组3行4列的三维数组
//字符串数组定义应留意会多一个'\0'存储单元
数组传递
传递的是数组的首地址,函数中的数组被更改,主函数中的数组也会被更改
例如:
int main()
{
int a[3];
ReadScore(a);
return 0;
}
void ReadScore(int s[]) //输入数组
{
printf("请输入分数:");
for(int i=0;i<3;i++)
{
scanf("%d",&s[i]);
}
}
//当ReadScore函数中的数组被赋值时,main函数中的a数组也会跟着变化
输入数组时输入-1结束
int ReadScore_end(int s[]) //输入数组时输入-1结束
{
int i = -1;
do
{
i++;
printf("请输入分数:");
scanf("%d",&s[i]);
}while(s[i] >= 0);
return i;
}
数组查找
找最大值:
假定数组的第一个是最大值max,启动循环,将它与后面的每一个进行比较,如果有更大的就替换,循环结束,输出max
int main()
{
//定义数组
int a[5]={84,83,88,87,61};
int m;
m=FindMaxValue(a,5);
return 0;
}
int FindMaxValue(int x[],int n)
{
int maxValue;
maxValue = x[0];
for(int i=0;i<n;i++)
{
if(x[i] > maxValue)
{
maxValue=x[i];
}
}
return maxValue;
}
线性查找
从开头到结尾或从结尾到开头有序查找
int LinSearch(int x[],int y,int n)
{
for(int i=0;i<n;i++)
{
if(x[i]==y)
{
return i; //找到y返回x数组的位置
}
}
return -1; //如果没有找到y就返回-1
}
二分查找(折半查找法)
int BinSearch(int x[],int y,int n) //数组已经按照顺序从小到大排列
{
int low=0,high=n-1,mid; //三个坐标位置 low头 high尾 mid需要与y进行比较的坐标
while(low <= high)
{
mid = (high + low)/2; //用mid =low + (high - low)/2替换此句可以使程序更安全,防止溢出
if(x > x[mid])
{
low = mid + 1; //发现要找的数比mid所在的数大,位置前进一位
}
else if(x < x[mid])
{
high = mid - 1; //发现要找的数比mid所在的数小,位置后退一位
}
else
{
return mid;
}
}
return -1; //没有找到
}
当low>high时,数组中没有y(抱歉抱歉图里写错了)
🍄数组排序
冒泡排序
比较相邻的两个数据,若顺序不对,则将其位置交换(例如体育课排队)
//升序排序:从小到大
void Bubbleort(int s[],int n) //s为需要排序的数组,n为数组个数
{ int temp; //用来交换数组的容器
for(int i=0;i<n-1;i++)
{
for(int j=1;j<n-i;j++)
{
if(s[j] < s[j-1])
{
temp = s[j];
s[j] = s[j-1];
s[j-1] = temp;
}
}
}
}
交换排序法
注意与冒泡排序区分开,冒泡排序是与相邻的数进行比较,交换排序是与它后面所有的数都比较一遍
void ChangeSort(int s[],int n) //交换排序法 升序排序
{
int temp;
for(int i=0;i<n-1;i++)
{
for(int j=1;j<n-i;j++)
{
if(s[j] < s[i])
{
temp = s[j];
s[j] = s[i];
s[i] = temp;
}
}
}
}
选择排序法
在每一遍比较中,在剩余的待比较的数中选择一个最小的数与这个剩余序列的第一个数交换
void SelectionSort(int s[],int n) //升序排序
{
int k,temp;
for(int i=0;i<n-1;i++)
{
k=i;
for(int j=i+1;j<n;j++)
{
if(s[j]<s[k])
{
k=j; //记录最小数下标位置
}
}
if(k != i) //若最小数不在下标位置i
{
temp = s[k];
s[k] = s[i];
s[i] = temp;
}
}
}