先说数组,很简单,就是一组数,不过这组数有点特性:
1、数组中的类型都是同一类型,数组的长度在创建时被确定,并且在创建后不变。解释下,声明一个数组的方法是int i[5];,它的意思就是i是个整数(int)类型的数组,它能容纳的最多元素是5个,且元素都必须是整数类型的。
2 、在JAVA语言中,数组是个对象,所以创建数组的应与创建对象一样也是用关键字new来创建的,举个例子,s=new char[20];p=new int[50];。。。
在C语言中,数组是个数据,它与JAVA语言相比较,在C语言中,创建一个数组则是与创建一个数据一样,例如int a[5];它表示a是整数(int)类型的数组,它能容纳的最多的整数类型的元素为5个。
3、数组在被创建后,其元素被自动初始化了,字符元素被初始化为“\u0000”,而对于对象数组都被初始化为null,如果你不初始化的话,在内存中是找不到它的位置。
4、数组的第一个元素记作第0个,i[0]是数组i的第一个元素。
现在假设a是数组,现在要创建一个数组,应该为int a[4];我们现在研究的是算法,而算法是研究数据的,所以我们研究数组一般都是以C语言为基础的。例如int a[4];它代表什么呢?代表的是a为整数类型的数组,它能容纳的最多元素为4个,切必须是整数类型的。在这里说明下"[ ]"中代表的数字是数组能容纳的最多元素的取值,当然元素也可以少于这个长度,这样结果是在内存中有它的地址,而不会有它的数据。int a[4];代表的是数组。。那么char s[50];呢??
我们说过,数组的第一位记作“0”,也就是从0开始。举一个例子,int a[4];a[0]=1;
举一个例子:
int a[4];
a[0]=1;
代表什么?
它代表的是这个整型数组的第一个元素是1;那么:
int main
{
int a[4]={5,48,412,89};
for(int i=0;i<4;i++){
printf(a[i]);}
system="PAUSE";
return=0;
}
代表什么呢?由此看出,数组就是一组数,以第0个开始的一组数。
一维数组,在内存里面是横着排的一条线。
二维数组,是一个矩形。表达式为:int a[ ][ ];例如:int a[3][2]={{1,2},{847,46},{41,879}}; int a[3][2];代表着数组a中最多有3个元素,每个元素中最多有2个元素。也就是说,第一个“[ ]”代表数组中含有最多的元素,第二个"[ ]"代表每个元素含有最多的元素。比如说int a[0][0]==1;int a[1][1]==46;那么int a[2][2]==?
没有这个数,这是数组越界,很危险的越界程序。C语言越界后,地址就会暴露,黑客知道地址是多少的话,就可以推算出起始地址,内存中的地址,被人家算出来,他们就可以专门写程序,把数组里面的元素都冲击出来,而取而代之的是他们的代码程序。
下面说下著名的“阿拉赛维晒”算法:
先看一段代码:
#define N 100
int main()
{
int i,j,a[N];
for (i = 2;i < N;i++) { a[i] = 1;}
for (i = 2;i < N;i++)
if (a[i])
for (j = i; j<=N/i;j++) a[i*j] = 0;
for (i = 2;i<N;i++)
if (a[i]) printf("%4d \n",i);
system("PAUSE");
return 0;
}
这个算法叫做“阿拉赛维筛”,阿拉赛维是公元前3世纪一个数学家,这个程序就是利用他的思想,这里利用数组的索引高效选择。
先看代码,这个算法的目的是求100以内的素数。我们把100以内是素数的设为1(即a[i]==1),不是素数的设为0(a[i]==0),一共有四个循环,第一次循环,把i=2~99所有的数都设为素数,1不用,因为1既不是合数,又不是素数。所以从2开始。
for(j=i;i<=N/J;j++) a[i*j]=0;
这是第三次循环,潜入在if语句中,已知的素数的倍数一定不是素数,比如说i=2,j也等于2吧,N为100,N/i就是50,a[2*2]就是4,4一定是合数。那要是循环的98,这49个数都是合数,所以这些项都等于0,如果i=3,j=3,N/i就是33,循环这32次,a[3*3]=9,这里的32次,从9,27,……,99都是合数。依此类推,现在就是知道的是某某个数的倍数的都是合数,都赋值为0,直到最后。把等于1的索引项拿出来,再用第四个循环把i=1打印出来。就得到结果了。
阿拉塞维筛,这种算法将数据像过筛子一样,以一种或多种规则筛选。这也是最基本的算法。。。。