有序表查找(折半查找与插值查找)

有序表查找(折半查找与插值查找)

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

//折半查找的时间复杂度为O(logn) 但对于需要频繁执行插入或删除操作
//的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用
int Binary_Search(int* a, int index, int key)
{
	int low = 0;
	int high = index;
	int mid;
	while (low <= high)
	{	
		mid = low + (high-low) / 2;
		if (a[mid] == key)
			return mid;
		else if (key > a[mid])
			low = mid + 1;
		else
			high = mid - 1;		
	}
	return -1; //返回-1则没找到
}

//插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法
//其核心就在于插值的计算公式 key-a[low]/a[high]-a[low] 从时间复杂度来看也是O(logn)
//但对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找的性能比折半查找好
int Interpolation_Search(int* a, int index, int key)
{
	int low = 0;
	int high = index;
	int mid;
	while (low <= high)
	{
		mid = low + (high - low)*(key - a[low]) / (a[high] - a[low]);  //插值
		if (a[mid] == key)
			return mid;
		else if (key > a[mid])
			low = mid + 1;
		else
			high = mid - 1;
	}
	return -1; //返回-1则没找到
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a[] = { 0,1,16,24,35,47,59,62,73,88,99 };
	//俩个函数的第二个参数是数组的下标 要注意大小
	int flag1 = Binary_Search(a, sizeof(a) / sizeof(a[0])-1, 100);
	int flag2 = Interpolation_Search(a, sizeof(a) / sizeof(a[0])-1, 100);
	if (flag1 == -1)
		cout << "没找到" << endl;
	else
		cout << "找到了" << endl;
	if (flag2 == -1)
		cout << "没找到" << endl;
	else
		cout << "找到了" << endl;	
	return 0;
}


猜你喜欢

转载自blog.csdn.net/SwordArcher/article/details/80012682