注:本文是苏小红版c语言程序设计第8章的笔记
- 定义数组时不可以用变量定义数组的大小
int score [5] = {1, 2, 3, 4, 5};
<=>int score[] = {1, 2, 3, 4, 5};
static int score[5]
<=>static int score [5] = {0,0,0,0,0}
- 数组第二维的长度声明永远都不能省略, 因为C中二维数组的元素是按行存放的(即现存第一行,再存第二行…)
- 向函数传递一维数组:
void Readscore(int score[], int n);
...
int score[N];
...
Readscore(score, n);//数组名作函数实参调用函数
- 数组作函数形参时,数组的长度可以不出现在数组名后面的方括号内,通常是用另一个整型形参来制定数组的长度。(因为即使写了编译器也只检查是否是负数,并不能真正表示出接受的数组的大小)
- 排序
- 交换排序(以降序为例):
void descending(int score[], int n)
{
int i, j;
int temp;
for(i = 0; i < n; i ++)
{
for(j = i + i; j < n; j ++)
{
if(score[i] < score[j])
{
temp = score[i];
score[i] = score[j];
score[j] = temp;
}
}
}
}
- 选择排序(以降序为例):
void descending(int a[], int n)
{
int i, j, k;
int temp;
for(i = 0; i < n; i ++)
{
k = i;
for(j = i + 1; j < n; j ++)
{
if(a[j] < a[k]) k = j;
}
temp = a[j];
a[j] = a[k];
a[k] = temp;
}
}
- 冒泡排序(以降序为例):不断交换相邻的两个数
void descending(int a[], int n)
{
int i, j;
int temp;
for (i = 0; i < n - 1; i ++)//注意有减1!
{
for(j = 0; j < n - i - 1; j ++)//注意有减1!
{
if(a[j] < a [j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
- 折半查找(以降序数组为例)
int Binsearch(int a[], int n, int x){
int low, high, mid;
low = 0;
high = n - 1;
while(low <= high){
mid = low + (high - low)/2;
if(a[mid] > x){
low = mid + 1;
}else if(a[mid] < x){
high = mid - 1;
}else{return (mid);}
}
return -1;
}
也可以使用标志变量法
int Binsearch(int a[], int n, int x){
int low, high, mid;
low = 0;
high = n - 1;
int find = 0;
while(low <= high && !find){
mid = low + (high - low)/2;
if(a[mid] > x){
low = mid + 1;
}else if(a[mid] < x){
high = mid - 1;
}else{
pos = mid;
find 1;
}
}
return pos;
}