数组在c语言学习中一个重要的部分,合理使用会让程序设计的更加简洁。
定义:一组具有相同元素类型的变量的集合。
数组的定义形式:数据类型 数组名 数组下标
如:int score[5];(注:数组下标都是从0开始,且在定义数组时不能使用变量定义数组的大小)
一维数组的初始化:int s[5]={1,5,6,7,3};
或 int s[ ]={1,2,3,4,6};
注:使用数组时要在定义元素下标范围内使用,防止数组越界。
二维数组定义:当一维数组元素的类型也是一维数组时,便构成了“数组的数组”,即二维数组。
定义的一般格式:数据类型 数组名 [下标1][下标2]
二维数组实质上相当于一个数据表格,第n行m列对应的数组元素即为a[n-1][m-1]。
二维数组的初始化和一维数组相同,即int a[2][2]={{1,0},{0,4}};
字符数组
格式:char 数组名[下标]
初始化:char a[2]={'a','c'};
char a[2]=“abcd”;
数组的使用:除普通的存储数据的简单应用外,常用数组对无规则的数据进行排序,从无规则的数据中查找相应数据,这就需要用到以下要介绍的排序查找方法。
一 三大排序
1 选择排序
for (int i=0; i<n-1; i++)
{
int k = i;
int key = a[i];
for (int j=1; j<n; j++)
{
if (a[j]<key)
{
k = j;
key = a[j];
}
}
if (k!=i)
swap(a[i], a[k]);
}
原理:从待排序的一组数中选出最大或最小的数放在排好数列的最前或最后。
2 插入排序
for(int i=1; i<10; i++) {
int temp=a[i];
int k;
for(k=i-1;k>0;k--) {
if(temp>a[k]) {
a[k+1]=a[k];
} else
break;
}
a[k+1]=temp;
}
原理: 每步将一个待排序的几率按其顺序码大小插入到前面已排序的序列的合适位置(从后向前找到合适位置后),直到全部插入排序。
3 冒泡排序
int temp;
for (int i = 0; i < length; ++i)
{
for (int j = 0; j < length - i - 1; ++j)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
原理:比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
二 sort排序
最简单的排序
sort(a,a+10)
左边为第一个数据,右边加第一个无意义的数据
sort(a,a+10,comp)
由于sort排序默认从小到大,如果想要自己定义,只需加入comp(函数名),便可自己编写排序的方法。
三 快速的查找方法:二分查找
int BinarySearch(int A[], int n, int target) {
if(n <= 0){
return -1;
}//if
int start = 0,end = n-1;
// 二分查找
while(start <= end){
// 中间节点
int mid = (start + end) / 2;
// 找到
if(A[mid] == target){
return mid;
}//if
else if(A[mid] > target){
end = mid - 1;
}//else
else{
start = mid + 1;
}//else
}//while
return -1;
}
有时候用普通的查找方法可能会超时,在这种情况下可以考虑二分查找。它可以极大的缩短寻找元素的时间。但使用二分查找的时候要先排序,可以用上方的四种方法,常用sort。