数组
基本知识
1 定义:按顺序排列的一组同种类型的数据构成的集合。
2 数组的优势:保存大量同类型的相关数据 。
include<stdio.h>
int main()
{
int a[5];
for(int i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
3 注:
(1)数组的下标是从0开始的
如:a[5]是a[0],a[1],a[2],a[3],a[4] 五个
(2)一开始定义数组时下标不能是变量,只能是常量。
(3) 最好把数组定义为全局数组,即在main()之前。
是对全局初始化。
4 排序
(1)选择排序
#include<stdio.h>
main()
{
int a[100000];
int i,j,max,l,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(j=0;j<n-1;j++)
{ l=j;
for(i=1;i<n;i++)
if(a[l]<a[i])
l=i;
if(l!=j) //如果不相等
i=a[l],a[l]=a[j],a[j]=i;//则交换
}
return 0;
}
(2)插入排序
void insSort(int *a,int num)
{ for(i=1;i<num;i++)
{ l= i-1;temp=a[i];
while(l>=0&&a[l]>temp)
{ a[l+1]=a[l];
l--;
}
a[l+1]=temp;
}
}
(3)冒泡法排序
#include<iostream>
#include<iomanip>
using namespace std;
const int n=10;
int t,a[n+1]; //定义数组
int main()
{
for (int i=1; i<=n; ++i)
cin>>a[i]; //输入十个数
for (int j=1; j<=n-1; ++j)//冒泡法排序
for (int i=1; i<=n-j; ++i) //两两相比较
if (a[i]<a[i+1]) //比较与交换
{t=a[i]; a[i]=a[i+1]; a[i+1]=t;}
for (int i=1; i<=n; ++i)
cout<<setw(5)<<a[i]; //输出排序后的十个数
cout<<endl;
return 0;
}
运行结果:输入: 2 5 8 6 12 34 65 22 16 55
输出: 65 55 34 22 16 12 8 6 5 2
(4)函数排序
#include <algorithm>
using namespace std;
默认的sort函数是按升序排。
sort(a,a+n);
两个参数分别为待排序数组的首地址和尾地址
5 查找(前提是已排序)
(1)常规方法:顺序查找
(2)折半查找
优点:减少计算量,减少运算时间
相当于数学中的二分法
low=0,high=n-1,mid=0;
while(low<=high)
{ mid=(low+high)/2;
if(a[mid]>temp) high=mid-1;
else if(a[mid]<temp) low=mid+1;
else cout<<a[mid]<<endl;
}
cout<<"Not Found!"<<endl; }
6二维数组
只是比一维数组多增加了一维下标,例:
#include<stdio.h>
int a[305][305];/*定义一个全局的二维数组*/
int main()
{
int n,i,j,s=0,m;
scanf("%d %d", &n,&m);
for(i=1;i<=n;i++)/*行下标变化*/
{
for(j=1;j<=m;j++)/*列下标变化*/
{
scanf("%d",&a[i][j]);
}
}
例:int a[3][5]; a是二维数组(相当于一个3*5的表格),共有3*5=15个元素,它们是:
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]
因此可以看成一个矩阵(表格),a[2][3]即表示第3行第4列的元素。
7 字符数组与字符串
学的不多,这里粗略总结一下:
(1)字符数组的定义格式
字符数组定义格式同于一般数组,所不同的是数组类型是字符型,第一个元素同样是从ch1[0]开始,而不是ch1[1]。
具体格式如下:
[存储类型] char 数组名[常量表达式1]… 例如:
char ch1[5]; //数组ch1是一个具有5个字符元素的一维字符数组
char chr1[5]={‘a’,‘b’,‘c’,‘d’,‘e’}; 字符数组中也可以存放若干个字符,也可以来存放字符串。两者的区别是字符串有一结束符(‘\0’)。
反过来说,在一维字符数组中存放着带有结束符的若干个字符称为字符串。
字符串是一维数组,但是一维字符数组不等于字符串
(2)字符串
字符串的输入:
输入多个字符串时,以空格分隔。
例如:scanf(“%s%s%s”,s1,s2,s3);从键盘分别输入Let us go,则三个字符串分别获取了三个单词。
例如:scanf(“%s”,s1);从键盘分别输入Let us go,则仅有第一个单词被获取,即s1变量仅获取第一个单词Let。
使用gets只能输入一个字符串。读入的是一整行,包括空格。
例如:scanf(“%s”,s1);gets(s2);对于相同的输入Hello World!。s1获取的结果仅仅是Hello,而s2获取的结果则是Hello World!
输出
(1)printf语句 格式:printf(“%s”,字符数组名);
(2) puts语句 格式:puts(字符串名称);
说明:puts语句输出一个字符串和一个换行符。
对于已经声明过的字符串a,printf(“%s\n”,a)和 puts(a)是等价的。
可以解决的问题:
1 一维数组
(1)输出满足某一条件的数目,如寻找配对数,与指定数字相同的个数
(2)判断一组数据是否满足某一条件,如有趣的跳跃
(3)输出满足几个指定范围的个数,如年龄与疾病
2 二维数组
一般与矩阵的简单变化有关
感受
数组是对前面循环的扩充,综合性较强,有的题还需要转化成数学问题,好多题都需要想??好长时间才有思路,??,最后不会的还要问别人,真是考验人……