二分法和线性查找原理以及实现
2010-05-12 08:45
148 查看
1.二分法查找原理
左侧这张图说明了二分法查找的原理以及查找过程
实现代码
又称之为折半查找,一种计算复杂度为log(n)的查找方法,与线性查找相比,数量级越大,效率的优势越是明显。但是二分法查找的前提是“已经排序好的线性表”,也就是说,一维数组中的数据必须是已经排序好了,才能使用二分法来进行查找,排序方式没有影响。
左侧这张图说明了二分法查找的原理以及查找过程
实现代码
#include <stdio.h>
int search(int array[] , int n , int v);
int search_recursion(int array[] , int low , int high , int v);
int main(void){
int a[10] = {1,2,3,4,5,6,7,8,9,10};//设置有序数组
int size = (sizeof(a))/(sizeof(a[0]));//提取数组的个数
int s , sr;
/*第一种方法*/
s = search(a , size , 1);
printf("%d\n", s);
/*第二种方法*/
sr = search_recursion(a , 0 , size , 4);
printf("%d\n" , sr);
return 0;
}
/*第一种采用了循环迭代的方法*/
int search(int array[] , int n , int v){
int left , middle , right;
left = 0 ;
right = n - 1;
while(left <= right){
middle = (left + right)/2;
if(v > array[middle]){
left = middle + 1;//折半的过程
}else if(v < array[middle]){
right = middle - 1;
}else{
return middle;
}
}
return -1;
}
/*第二种采用递归的方法,效率那叫一个猥琐*/
int search_recursion(int array[] , int low , int high , int v){
int middle;
middle = (low + high) / 2;
if(low < high){
if(v > array[middle]){
return search_recursion(array, middle + 1, high, v);//折半的过程
}else if(v < array[middle]){
return search_recursion(array, low, middle, v);
}else{
return middle;
}
}else if(low == high){
if(v == array[middle]){
return middle;
}else{
return -1;
}
}else{
return -1;
}
return -1;
}
2.线性查找原理int search(int array[] , int n , int v);
int search_recursion(int array[] , int low , int high , int v);
int main(void){
int a[10] = {1,2,3,4,5,6,7,8,9,10};//设置有序数组
int size = (sizeof(a))/(sizeof(a[0]));//提取数组的个数
int s , sr;
/*第一种方法*/
s = search(a , size , 1);
printf("%d\n", s);
/*第二种方法*/
sr = search_recursion(a , 0 , size , 4);
printf("%d\n" , sr);
return 0;
}
/*第一种采用了循环迭代的方法*/
int search(int array[] , int n , int v){
int left , middle , right;
left = 0 ;
right = n - 1;
while(left <= right){
middle = (left + right)/2;
if(v > array[middle]){
left = middle + 1;//折半的过程
}else if(v < array[middle]){
right = middle - 1;
}else{
return middle;
}
}
return -1;
}
/*第二种采用递归的方法,效率那叫一个猥琐*/
int search_recursion(int array[] , int low , int high , int v){
int middle;
middle = (low + high) / 2;
if(low < high){
if(v > array[middle]){
return search_recursion(array, middle + 1, high, v);//折半的过程
}else if(v < array[middle]){
return search_recursion(array, low, middle, v);
}else{
return middle;
}
}else if(low == high){
if(v == array[middle]){
return middle;
}else{
return -1;
}
}else{
return -1;
}
return -1;
}
假设一个数组中有 n 个元素,最好的情况就是要寻找的特定值就是数组里的第一个元素,这样仅需要1次比较就可以。而最坏的情况是要寻找的特定值不在这个数组或者是数组里的最后一个元素,这就需要进行 n 次比较。线性查找的计算复杂度为n,查找的快慢和人品有极大的关系,人品爆发,第一个就有机会中奖,人品差,要搜到最后一个才能得出结果,本人取了个别名“线性人品查找”
实现代码 /*线性查找*/
int search_sequential(int array[] , int v , int size){
int i;
if(size > 0){
for(i = 0 ; i < size ; i++){
if(v == array[i]){
return i;
break;
}
}
}
printf("查找的数据 %d不在数组中\n", v);
return 0;
}
int search_sequential(int array[] , int v , int size){
int i;
if(size > 0){
for(i = 0 ; i < size ; i++){
if(v == array[i]){
return i;
break;
}
}
}
printf("查找的数据 %d不在数组中\n", v);
return 0;
}
相关文章推荐
- 适配器模式原理、两种适配器模式实现方法以及实例介绍
- jQuery的datatable的使用例子,以及通过例子分析datatable插件的实现过程,即不但要会用,还要懂其原理
- Android MultiDex实现原理以及Dex文件结构
- 后缀树系列一:概念以及实现原理( the Ukkonen algorithm)
- Linux进程间通信分类 以及 pipe的原理实现
- 傅立叶变换的原理、意义以及如何用Matlab实现快速傅立叶变换
- Native App vs Web App 以及 Hybrid App的实现原理
- RESTFUL API 原理以及实现
- CA认证原理以及实现(上)
- [android view]标签云原理、难点以及简单实现总结
- MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct
- 快速排序算法原理,实现,以及时间复杂度分析
- TCP/IP原理、基础以及在Linux上的实现 (5)
- HashMap的实现原理以及面试官的提问
- jsp自定义标签技术(实现原理与代码以及平台搭建步骤)
- malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理
- 关于BASE 24 ,BASE 64原理以及实现程序
- 栈的链表实现,以及编译原理中的括号匹配
- 【STL】栈的实现原理以及应用
- Qt中Ui名字空间以及setupUi函数的原理和实现