对无序数组的查询
所谓无序数组,就是数组元素的排列没有规律。无序数组元素查询的思路也很简单,就是用循环遍历数组中的每个元素,把要查询的值挨个比较一遍。请看下面的代码:
1 #include <stdio.h> 2 int main(){ 3 int nums[10] = {1, 10, 6, 296, 177, 23, 0, 100, 34, 999}; 4 int i, num, thisindex = -1; 5 6 printf("Input an integer: "); 7 scanf("%d", &num); 8 for(i=0; i<10; i++){ 9 if(nums[i] == num){ 10 thisindex = i; 11 break; 12 } 13 } 14 if(thisindex < 0){ 15 printf("%d isn't in the array.\n", num); 16 }else{ 17 printf("%d is in the array, it's index is %d.\n", num, thisindex); 18 } 19 20 return 0; 21 }
运行结果:
Input an integer: 100↙
100 is in the array, it's index is 7.
或者
Input an integer: 28↙
28 isn't in the array.
这段代码的作用是让用户输入一个数字,判断该数字是否在数组中,如果在,就打印出下标。
第10~15行代码是关键,它会遍历数组中的每个元素,和用户输入的数字进行比较,如果相等就获取它的下标并跳出循环。
注意:数组下标的取值范围是非负数,当 thisindex >= 0 时,该数字在数组中,当 thisindex < 0 时,该数字不在数组中,所以在定义 thisindex 变量时,必须将其初始化为一个负数。
对有序数组的查询
查询无序数组需要遍历数组中的所有元素,而查询有序数组只需要遍历其中一部分元素。例如有一个长度为 10 的整型数组,它所包含的元素按照从小到大的顺序(升序)排列,假设比较到第 4 个元素时发现它的值大于输入的数字,那么剩下的 5 个元素就没必要再比较了,肯定也大于输入的数字,这样就减少了循环的次数,提高了执行效率。
1 #include <stdio.h> 2 int main(){ 3 int nums[10] = {0, 1, 6, 10, 23, 34, 100, 177, 296, 999}; 4 int i, num, thisindex = -1; 5 6 printf("Input an integer: "); 7 scanf("%d", &num); 8 for(i=0; i<10; i++){ 9 if(nums[i] == num){ 10 thisindex = i; 11 break; 12 }else if(nums[i] > num){ 13 break; 14 } 15 } 16 if(thisindex < 0){ 17 printf("%d isn't in the array.\n", num); 18 }else{ 19 printf("%d is in the array, it's index is %d.\n", num, thisindex); 20 } 21 22 return 0; 23 }
与前面的代码相比,这段代码的改动很小,只增加了一个判断语句,也就是 12~14 行。因为数组元素是升序排列的,所以当 nums[i] > num 时,i 后边的元素也都大于 num 了,num 肯定不在数组中了,就没有必要再继续比较了,终止循环即可。