您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习笔记-2.顺序查找与折半查找比较

2009-07-23 19:36 633 查看
前段时间,忙于工作又将数据结构停下了一周,现在拾起继续!

 

/************************************************************************/
/* FindData.cpp  顺序查找与折半查找比较                                    */
/************************************************************************/
#include "StdAfx.h"
#include <iostream.h>
#include "dsearch.h"
#include "random.h"

/************************************************************************/
/* 将n元整数数组按升序排序				                                    */
/************************************************************************/
void ExChangeSort(int a[],int n)
{
int i,j,temp;

// 循环n-1次,排好a[0],a[1],...,a[n-2]
for(i=0;i<n-1;i++)
{
// 将a[i]-a[n-1]中最小值置于a[i]中
for(j=i+1;j<n;j++)
{
// 若a[j]<a[i],则互换两元素
if (a[j]<a[i])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}

/************************************************************************/
/* 用顺序查找在n无素数List中查找与key等值的元素,返回该数组元素的下标           */
/* 若未找到,则返回-1。		  				                             */
/************************************************************************/
int SeqSearch(DataType List[],int n,DataType key)
{
for(int i=0;i<n;i++)
{
// 返回等值数组元素的下标
if(List[i] == key)
return i;
}
// 未找到,则返回-1
return -1;
}

/************************************************************************/
/* 用折半查找算法在一有序数组中查找key值。若找到,返回其下标值		            */
/* 若未找到,则返回-1。	  			                                      */
/************************************************************************/
int BinSearch(DataType List[],int low,int high,DataType key)
{
int mid;
DataType midvalue;
while(low<=high)
{
// 子表中间元素的下标、中间元素的值
mid = (low+high)/2;
midvalue = List[mid];

// 找到key值,返回其下标值
if(key == midvalue)
return mid;
// 继续查找子表的左半部分
else if(key < midvalue)
high = mid-1;
// 继续查找子表的右半部分
else
low  = mid+1;
}
// 元素没有找到
return -1;
}

/************************************************************************/
/* Main入口函数                                                          */
/************************************************************************/
int main()
{
// A为被查数组,B为key值数组
int A[100],B[100];
int i,matchCount;

// 用于计时
long tcount;
RandomNumber rnd;

// 用随机数生成法生成10000个0-1999之间的整数放于A数组中
for(i=0;i<1000;i++)
{
A[i]=rnd.Random(2000);
}
ExChangeSort(A,1000);

// 同样范围内生成500个key值置于B中
for(i=0;i<500;i++)
{
B[i]=rnd.Random(2000);
}
cout<<"Tiiming the Sequential Search:"<<endl;

// 开始计时
tcoun = TickCout();
matchCount = 0;
for(i=0;i<500;i++)
{
if(SeqSearch(A,1000,B[i]) != -1)
matchCount++;
}

// 时间单位为1/60秒
tcount = TickCount()-tcount;
cout<<"Sequential Search takes:"<<tcount/60.0
<<"seconds for"<<matchCount<<"matches."<<endl;
cout<<"Timing the Binary Search:"<<endl;

// 开始计时
tcount = TickCount();
matchCount = 0;
for(i=1;i<500;i++)
{
if(BinSearch(A,0,999,B[i] != -1)
matchCount++;
}
// 时间单位为1/60秒
tcount = TickCount() - tcount;
cout<<"Sequential Search takes:"<<tcount/60.0
<<"seconds for"<<matchCount<<"matches."<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息