基本查找/顺序查找
#include <stdio.h>
// 基本查找/顺序查找
int orderSearch(int array[], int length, int number);
int main(void) {
/*
* 基本查找/顺序查找:
* 从数组的0索引开始,依次向后查找
* 如果找到了,返回数据对应的索引
* 如果没有找到,返回-1
* */
int arr[] = {11, 22, 55, 77, 44};
int len = sizeof(arr) / sizeof(arr[0]);
int num;
printf("输入要查找的数:");
scanf("%d", &num);
int index = orderSearch(arr, len, num);
if (index == -1) {
printf("没有这个数据\n");
} else {
printf("arr[%d] = %d\n", index, arr[index]);
}
return 0;
}
int orderSearch(int array[], int length, int number) {
for (int i = 0; i < length; i++) {
if (number == array[i]) {
return i;
}
}
return -1;
}
二分查找/折半查找
#include <stdio.h>
// 二分查找/折半查找
int binarySearch(int array[], int length, int number);
int main(void) {
/*
* 二分查找/折半查找:
* 前提条件:数组中的数据必须是有序的
* 核心逻辑:每次排除一半的查找范围
* */
int arr[] = {7, 23, 79, 81, 103, 127, 131, 147};
int len = sizeof(arr) / sizeof(arr[0]);
int num;
printf("输入要查找的数字:");
scanf("%d", &num);
int index = binarySearch(arr, len, num);
if (index == -1) {
printf("没有这个数据\n");
} else {
printf("arr[%d] = %d\n", index, arr[index]);
}
return 0;
}
int binarySearch(int array[], int length, int number) {
int min = 0;
int max = length - 1;
while (max >= min) {
int mid = (max + min) / 2;
if (number > array[mid]) {
min = mid + 1;
} else if (number < array[mid]) {
max = mid - 1;
} else {
return mid;
}
}
return -1;
}
插值查找
#include <stdio.h>
// 插值查找
int interpolationSearch(int array[], int length, int number);
int main(void) {
/*
* 插值查找:
* 要求:数据要有序,且数据分布尽可能的均匀一点
* 优势:满足要求,效率比二分查找快,否则反而会更慢
* */
int arr[] = {7, 23, 79, 81, 103, 127, 131, 147};
int len = sizeof(arr) / sizeof(arr[0]);
int num;
printf("输入要查找的数字:");
scanf("%d", &num);
int index = interpolationSearch(arr, len, num);
if (index == -1) {
printf("没有这个数据\n");
} else {
printf("arr[%d] = %d\n", index, arr[index]);
}
return 0;
}
int interpolationSearch(int array[], int length, int number) {
int min = 0;
int max = length - 1;
while (max >= min) {
int mid =
min + (max - min) * (number - array[min]) / (array[max] - array[min]);
if (number > array[mid]) {
min = mid + 1;
} else if (number < array[mid]) {
max = mid - 1;
} else {
return mid;
}
}
return -1;
}