供自己或有需要的朋友查询参考。
博客内容为自我总结而来,所以描述皆按本人理解,如有错误请帮忙指出来谢谢。
1.顺序查找(线形查找)
属于无序查找算法。从表的某端开始,按顺序进行查找。查找成功时的平均查找长度为: ASL = 1/n(1+2+3+…+n) = (n+1)/2 。
时间复杂度为O(n)。
使用代码来理解
//a[]为要查询的表,key为要查询的值,n表示查询表内元素的个数
int SequenceSearch(int a[], int key, int n){
for(int i = 0; i < n; ++i){
if(a[i] == key){
return i;
}
}
return -1;
}
2.二分查找(折半查找)
属于有序查找算法。时间复杂度:O(log2n)
实现:将数组折半,然后将中间那个数(a[mid])与要查找的值(key)进行对比。是输出,否,再与要查找的数(key)进行大小对比(判断下一次折半的是哪一边的表)。大的话,将最大下标(high)降为:折半下标(mid)-1.小的话,将最小下标(low)升为:折半下标(mid)+1(因为中间那数已经对比过,所以赋予的是中间那数的两侧)。然后再次进行二分查找。
使用代码来理解
//a[]为要查询的表,key为要查询的值,n表示查询表内元素的个数
int BinarySearch(int a[], int key, int n){
int low, high, mid;
low = 0;
high = n - 1;
while( low <= high ){
mid = (low + high)/2; //二分 表
if( a[mid] == key ){
return mid;
}
if( a[mid] > key ){
high = mid - 1; //重新设置查找范围[low,mid-1]
}
if( a[mid] < key){
low = mid + 1; //重新设置查找范围[mid+1,high]
}
}
return -1;
}
3.插值查询
属于有序查找算法,基于二分查找。
适用:表长较大,关键字分布又比较均匀的查找表。
时间复杂度:O(log2(log2n))。
关键 mid = low+(key-a[low])/(a[high]-a[low])*(high-low)
使用代码来理解
//a[]为要查询的表,key为要查询的值,low最小下标,high最大下标
int InsertialSearch(int a[], int key, int low, int high){
int mid;
while(low <= hight){
mid = low+(key-a[low])/(a[high]-a[low])*(high-low);
if(a[mid] ==key){
return mid;
}
if(a[mid] > key){
high = mid - 1; //将范围设置为[low,mid-1]
}
if(a[mid] < key){
low = mid + 1; //将范围设置为[mid+1,high]
}
}
return -1;
}