二. 数组的常见算法 :
1. 顺序查找 (基本查找): 利用顺序查找,在给定的数据中查找一个数据是否存在。若存在,输出元素的下标,否则输出不存在的信息。
# 分析 : 顺序查找就是从第一个元素开始,依次与要找的数据相比较。若相同,查找结束,输出下标;若不同,继续查找,直到最后一个元素,若还是没找到,则输出 不存在 的信息。
#include<stdio.h>
#define N 10
int main()
{
int a[N], i, x;
printf("输入%d个整数:",N);
for (i = 0; i <= N -1; i ++)
scanf("%d",&a[i]);
printf("输入要查找的数x:");
scanf("%d",&x);
for (i = 0;i <= N -1 && a[i] != x; i ++);
if (i >= N)
printf("未找到\n");
else
printf("找到了,是第%d个数\n",i + 1);
return 0;
}
<<< 运行结果 :
输入10个整数:45 6 7 8 9 54 23 12 23 10
输入要查找的数x:6
找到了,是第2个数
--------------------------------
Process exited after 6.466 seconds with return value 0
请按任意键继续. . .
2. 折半查找(二分查找): (连 (2)中的 插入排序)
任意输入一个数,在已按升序排好的一组数据中按折半查找算法找出这个数所在的位置。
# 分析 : 折半查找(二分查找)算法是一种效率较高的查找方法。折半查找算法的前提是数据已按升序(或 降序)排列好。其基本思想是:每次判断查找范围中间的数据是否为要找的数据,如果是,则查找结束;若要查找的数据小于中间的数据,则在查找范围较小续下去,。边继续查找;若要查找的数据大于中间的数据,则在查找范围较大的一边继续查找。如此继续下去,直至找到或查找范围结束。
#include<stdio.h>
# define N 14
int main()
{
int a[N + 1] = {99,4,1,7,55,97,45,23,6,3,67,77,65}; // 预留一个位置给新元素
int i, j, t, swapped;
// 1.冒泡排序: 使得数组中的元素按升序排列;
for (i = 0; i < N ; i ++)
{
swapped = 0; // 每次外层循环开始时重置 swapped
for (j = 0; j < (N - i - 1); j ++)
{
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
swapped = 1;
}
}
if (! swapped) break;
}
for(i = 0; i < N ; i ++) printf("%4d",a[i]);
printf("\n");
// 2. 插入一个元素: 使得数组中的元素仍按照升序排列;
int n;
scanf("%d",&n);
for (i = N - 1 ; i >= 0 && a[i] > n; i --)
{
a[i + 1] = a[i];
}
a[i + 1] = n;
for(i = 0; i < N + 1 ; i ++) printf("%4d",a[i]);
printf("\n");
// 3. 二分查找 : 查找 x 是否存在于数组 a[14] 中;
int min, max, mid, x;
scanf("%d",&x);
min = 0;
max = N; // 数组现在包含了 N + 1 个元素
int find = 0; // ! 标志 find 初始化为 0 : 即未找到 ;
do
{
mid = (min + max) / 2;
if (x == a[mid])
{
printf("found:%d,it is a[%d]\n",x,mid);
find = 1;
break;
}
else if (x < a[mid])
{
max = mid - 1;
}
else
{
min = mid + 1;
}
} while (min <= max);
if (!find)
printf("%d not found.\n",x);
return 0;
}
<<< 运行结果 :
0 1 3 4 6 7 23 45 55 65 67 77 97 99
34
0 1 3 4 6 7 23 34 45 55 65 67 77 97 99
46
46 not found.
--------------------------------
Process exited after 49.29 seconds with return value 0
请按任意键继续. . .