/********************************************************************
循环查找,二分法查找,分块查找
(二叉查找树(二叉排序树),哈希表查找以后碰到时在做笔记)
********************************************************************/
//顺序查找
#include <stdio.h>
int sequeceSearch(int* range,int length, int key)
{
for(int i=0; i<length; i++)
{
if(range[i] == key)
return i; //查找成功
}
return -1;//查找失败
}
//二分法递归查找
int binaryFind(int* range,int left,int right, int key);
int binarySearch(int* range,int length, int key)
{
if (range == NULL || length == 0)
return -1;
int left = 0;
int right = length - 1;
return binaryFind(range,left,right,key);
}
int binaryFind(int* range,int left,int right, int key)
{
if(left>right)
return -1;
int mid = (left + right)/2;
if(range[mid] == key)
return mid;
else if(range[mid] <key)
{
return binaryFind(range,mid+1,right,key);
}
else
{
return binaryFind(range,left,mid-1,key);
}
}
/*
//二分法非递归查找
int binarySearch(int* range, int length, int key)
{
if (range == NULL || length == 0)
return -1;
int left = 0;
int right = length -1;
int mid = (left + right)/2;
while(right >= left )
{
if(range[mid] == key)
return mid;
else if(range[mid] <= key)
left = mid + 1;
else
right = mid - 1;
mid = (left+right)/2;
}
return -1;
}
*/
/*
//分块查找
将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,
但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块
中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素...
step1 先选取各块中的最大关键字构成一个索引表;
step2 查找分两个部分:先对索引表进行二分查找或
顺序查找,以确定待查记录在哪一块中;
然后,在已确定的块中用顺序法进行查找。
#include <stdio.h>
struct index //定义块的结构
{
int key;
int start;
int end;
} index_table[4]; //定义结构体数组
int block_search(int key, int a[]) //自定义实现分块查找
{
int i, j;
i = 1;
while (i <= 3 && key > index_table[i].key) //确定在那个块中
i++;
if (i > 3) //大于分得的块数,则返回0
return 0;
j = index_table[i].start; //j等于块范围的起始值
while (j <= index_table[i].end && a[j] != key) //在确定的块内进行查找
j++;
if (j > index_table[i].end) //如果大于块范围的结束值,则说明没有要查找的数,j置0
j = 0;
return j;
}
*/
//单元测试
void test()
{
int arr[9] = {1,2,3,4,5,6,7,8,9};
int k = binarySearch(arr,9,1);
printf("%d\t",k);
k = binarySearch(arr,9,9);
printf("%d\t",k);
k = binarySearch(arr,9,7);
printf("%d\t",k);
}
int main()
{
test();
return 0;
}
三类基本查找算法(循环,二分,分块)
原文作者:查找算法
原文地址: https://blog.csdn.net/walkerkalr/article/details/20390559
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/walkerkalr/article/details/20390559
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。