顺序查找,又叫线性查找,是最基本的查找技术,他的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,如果全部比较仍没有相等的,则查找失败。
1. 顺序查找
//a为数组,n为查找的数组个数,key为要查找的关键字;
int Sequential_Search(int *a,int n,int key){
for (int i = 1; i <= n ; i++)
if (a[i] == key)
return i;
return 0;
}
顺序查找的优化
// 顺序查找优化
int Sequential_Search2(int *a, int n, int key){
a[0] = key;
int i = n; // 从后向前,减少for循环中 <= 计算
while (a[i] != key) {
i--;
}
return i;
}
2. 折半查找/二分查找
// 二分查找/折半查找
int Binary_Search(int *a, int n, int key){
int low = 1;
int high = n;
int mid = 0;
while (low <= high) {
mid = (low + high)/2;
if (a[mid] > key) {
high = mid-1;
}else if (a[mid] < key){
low = mid+1;
}else{
break;
}
}
return mid;
}
3. 插值查找
// 插值查找
int Interpolation_Search(int *a, int n, int key){
int low = 1;
int high = n;
int mid = 0;
while (low <= high) {
mid = low + (key-a[low]) / (a[high]-a[low]) * (high-low);
if (a[mid] > key) {
high = mid-1;
}else if (a[mid] < key){
low = mid+1;
}else{
break;
}
}
return mid;
}
4. 斐波拉契查找
int F[100];
int Fibonacci_Search(int *a, int n, int key){
int low,high,mid,i,k;
low = 1;
high = n;
k = 0;
// 1.计算n为斐波拉起数列的位置
while (n > F[k]-1) {
k++;
}
// 2.将数组a不满的位置补全
for (i = n; i<F[k]-1; i++) {
a[i] = a[n];
}
//3.循环对比
while (low <= high) {
// 计算当前分割的下标
mid = low + F[k-1] - 1;
if (key < a[mid]) {
high = mid - 1;
k = k-1;
}else if (key > a[mid]){
low = mid + 1;
k = k-2; //
}else{
if (mid <= n) {
return mid;
}else{
return n;
}
}
}
return 0;
}