排序和查找一向是考研,甚至是工作面试的必考题目,所以掌握这一块的内容非常有必要。
接下来笔者要对顺序查找、折半查找、分块查找进行简单讲解同时会附上代码。
尽量会用C语言和Python来实现这些简单的算法。
由于笔者能力有限,如有不妥之处敬请谅解,也请通过评论或者文章下方邮箱联系我,万分感谢。
一、顺序查找
顺序查找,又称为线性查找,主要用于在线性表中进行查找。线性表一般分为有序线性表和无序线性表。
1.对无序线性表进行查找
基本思路:从头到尾,依次与要查找的关键字比较。若相同,则返回下标;若不同,则返回-1。
C语言实现:
int SearchSeq(int *arr, int key){
//假设arr[N-1]位置为空,即数组arr存放的事无意义的数
int i;
arr[N-1] = key;
/*设置岗哨
这样做的目的是为了在循环内部,不必判断数组是否越界,
从而提升程序运行效率。
*/
for (i=0; arr[i]!=key;i++){
if (arr[i] == key)
break;
}
if (i == N-1)
return -1;
else
return i;
}
Python实现:
def SearchSeq(list, key):
for i in range(len(list)):
if list[i] == key:
return i
return -1
2.对有序线性表进行查找
对有序线性表进行查找稍有不同,其思想如下:
如果关键字key在线性表中可以找到,则查找方法与次数与对无序表进行查找是一样的。
如果关键字在线性表中找不到,则会有这着一种情况,数组arr[i]<key且arr[i+1]>key(数组arr的长度大于i+1),则循环停止,返回-1。
C语言实现:
int SearchSeq2(int *arr, int key){
int i;
arr[N-1] = key;
/*设置岗哨
这样做的目的是为了在循环内部,不必判断数组是否越界,
从而提升程序运行效率。
*/
for (i=0; arr[i]!=key;i++){
if (arr[i]<key && arr[i]> key){
return -1;
}
if (arr[i] == key)
break;
}
if (i == N-1)
return -1;
else
return i;
}
二、折半查找
折半查找,又称二分查找。仅适用于对有序表的查找。
基本思路:首先,将给定的关键字key与表中中间元素进行比较,若相等返回下标,若不等,则继续与除此中间元素的前半部分或后半部分进行同样的比较。
C语言实现:
int SearchBinary(int * arr, int key){
int low = 0, heigh = N-1, mid;
while(low <= heigh){
mid = (low + heigh)/2;
if (key==arr[mid])
return mid;
else if(key<arr[mid])
heigh = mid - 1;
else
low = mid +1;
}
return -1;
}
/*
递归实现,初始low=0,height为数组长度减一
*/
int SearchBinary2(int * arr, int key, int low, int heigh){
int mid = (low + heigh)/2;
if (low>heigh)
return -1;
if (arr[mid]==key)
return mid;
else if (arr[mid] > key)
return SearchBinary2(arr, key, low, mid-1);
else
return SearchBinary2(arr, key, mid+1, heigh);
}
Python实现:
def SearchBinary(l, key):
low = 0
height = len(l)-1
while low <= height:
mid = int((low + height)/2)
if l[mid] == key:
return mid;
elif l[mid] > key:
height = mid - 1
else:
low = mid + 1
return -1
def SearchBinary2(l, key, low, heigh):
mid = int((low+heigh)/2)
if low > heigh:
return -1
if l[mid] == key:
return mid
elif l[mid] > key:
return SearchBinary2(l, key, low, mid-1)
else:
return SearchBinary2(l, key, mid + 1, heigh)
当然,查找算法远远不止以上两种。感兴趣的同学可以移步:
有时间的话,我也会尽量去学习和完善这部分内容。
email: 17126252@bjtu.edu.cn
版权声明:博客编写不易,转载时请注明出处,万分感谢 !
https://blog.csdn.net/zyy_2018/article/details/79784390