一、折半查找
针对的是有序的数组
(1)基本思想
(2)算法
int BinSearch(int a[],int low,int high,int k) //拆半查找算法
{ int mid;
if (low<=high) //当前区间存在元素时
{ mid=(low+high)/2; //求查找区间的中间位置
if (a[mid]==k) //找到后返回其物理下标mid
return mid;
if (a[mid]>k) //当a[mid]>k时
return BinSearch(a,low,mid-1,k);
else //当a[mid]<k时
return BinSearch(a,mid+1,high,k);
}
else return -1; //若当前查找区间没有元素时返回-1
}
(3)算法分析
二、查找第k小元素
采用类似于快速排序的思想,减治法
(1)问题描述
举例:
(2)基本思想
int QuickSelect(int a[],int s,int t,int k)//在a[s..t]序列中找第k小的元素
{ int i=s,j=t,tmp;
if (s<t)
{ tmp=a[s];
while (i!=j) //从区间两端交替向中间扫描,直至i=j为止
{
while (j>i && a[j]>=tmp)
j--;
a[i]=a[j]; //将a[j]前移到a[i]的位置
while (i<j && a[i]<=tmp)
i++;
a[j]=a[i]; //将a[i]后移到a[j]的位置
}
a[i]=tmp;
if (k==i)
return a[i];
else if (k<i)
return QuickSelect(a,s,i-1,k);//在左区间中递归查找
else
return QuickSelect(a,i+1,t,k-i); //在右区间中递归查找
}
else if (s==t && s==k) //区间内只有一个元素且为a[k]
return a[k];
}
(3)算法分析