有序表:对于以数组方式存储的数据,如果已经按其关键字值的大小顺序排列好,则称为有序数组或有序表。
对有序表可以采用 折半查找(binary search),又称 二分查找。
设有序数组r中每个记录的关键字值按升序排列为:
r0.key, r1.key, r2.key, …, rm.key, …, rn-1.key
其中,n为记录个数。当i<j时,有ri.key≤rj.key。
折半查找法的基本思路(low、high和m分别指向待查元素所在区间的上界、下界和中点,k为要查找数据的关键字值):
(1)令low=0,high=n-1。
(2)如果low>high,则查找失败,并结束查找;否则,计算m=(low+high)/2。
(3)让k与m指向记录的关键字进行比较。
若k=r[m].key,则查找成功,结束查找。
若k<r[m].key,则使high=m-1,回到(2)继续查找。
若k>r[m].key,则使low=m+1,回到(2)继续查找。
对有序表可以采用 折半查找(binary search),又称 二分查找。
设有序数组r中每个记录的关键字值按升序排列为:
r0.key, r1.key, r2.key, …, rm.key, …, rn-1.key
其中,n为记录个数。当i<j时,有ri.key≤rj.key。
折半查找法的基本思路(low、high和m分别指向待查元素所在区间的上界、下界和中点,k为要查找数据的关键字值):
(1)令low=0,high=n-1。
(2)如果low>high,则查找失败,并结束查找;否则,计算m=(low+high)/2。
(3)让k与m指向记录的关键字进行比较。
若k=r[m].key,则查找成功,结束查找。
若k<r[m].key,则使high=m-1,回到(2)继续查找。
若k>r[m].key,则使low=m+1,回到(2)继续查找。
折半查找的实现: |
流程图 |
|
/*********************************************************/
/*函 数 名:search_ binary */
/*函数功能:有序顺序表的二分查找 */
/*入口参数:list —— 顺序表 */
/*k—— 待查找的关键字 */
/*返 回 值:成功,返回在有序表中的位置,失败,返回-1 */
/*********************************************************/
intsearch_binary (Seq list,int k)
{
int m, low, high, find;
low=0; high=list.len-1; find=0;
do
{
m=(low+high)/2;
if (k==list.r[m].key)
find=1;
else if(k<list.r[m].key)
high=m-1;
else if (k>list.r[m].key)
low=m+1;
}while ((find==0)&&(low<=high));
return( (find==0) ? –1 : m );
}