顺序查找&折半查找
顺序查找
基本流程:从线性表的一端开始,逐一查找满足条件的线性表元素,有则返回元素位置信息,无则返回错误信息。
#include <iostream>
using namespace std;
int seq_search(int arr[], int len, int key)
{
for(int i = 0 ; i < len ; i++)
{
if(arr[i] == key)
{
return i;
}
}
return -1;
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6};
int num = 6; //可以改为键盘输入,这里就不用了
int len = sizeof(arr)/sizeof(int);
int result = seq_search(arr, len, num);
if(result != -1)
{
cout << num << "在数组中的位置是:" << result << endl;
}
else
{
cout << "未找到对应值。" << endl;
}
return 0;
}
顺序查找引入“哨兵”
将数组arr中的末尾(或者首位)元素设置为需要查找的那个值,使得在循环过程中,不需要再判断数组下标是否越界。
#include <iostream>
using namespace std;
int seq_search(int arr[], int key)
{
arr[7] = key;
for(int i = 0 ; arr[i] != key ; i++)
{
;
}
return i;
}
int main()
{
int arr[7];
for(int i = 0; i < 6; i++)
{
arr[i] = i;
}
int num = 6; //可以改为键盘输入,这里就不用了
int result = seq_search(arr, num);
if(result != 7)
{
cout << "The position in the array is: " << result << endl;
}
else
{
cout << "Can not find the value." << endl;
}
return 0;
}
折半查找
折半查找也叫二分查找,用于有序的顺序表。
基本流程是:首先将需要查找的值key与表中间位置元素比较。如果相等,则查找成功并返回存储位置。如果不等,则根据比较信息,将接下来需要查找的区间定位在前半或后半部分,再在相应的部分继续进行以上操作。如此重复直到找到或返回错误信息。
#include <iostream>
using namespace std;
int bin_search(int arr[], int len, int key)
{
int low = 0;
int high = len - 1;
int mid;
while(low <= high)
{
mid = (low + high)/2;
if(arr[mid] < key)
{
low = mid + 1;
}
else if(arr[mid] > key)
{
high = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6};
int result = bin_search(arr, sizeof(arr)/sizeof(int), 4);
if(result == -1)
{
cout << "Can not find the value." << endl;
}
else
{
cout << "The position in the array is: " << result << endl;
}
return 0;
}