#include<iostream>
#include<string>
#include<time.h>
#include<algorithm>
using namespace std;
int rank1(int key, int *a,int length)
{
int lo = 0;
int hi = length -1;
int mid;
while(lo <=hi)
{
mid= (lo+hi)/2;
if(a[mid]==key) return mid;
else if(a[mid]>key) hi=mid-1;
else lo=mid+1;
}
return -1;
}
int main()
{
srand((unsigned int) time(0));
int a[100]={0};
for(int i=0;i<100;i++)
{
a[i] = rand()%1000;
}
sort(a,a+100);
a[99]=1001;
int result =rank1(10, a, 100);
cout<<result<<endl;
system("pause");
return 0;
}
使用前提:待查找的数组必须是有序的,这里排序采用了STL的sort方法,主要是基于快速排序算法的,在之后的博客里我会陆续更新。
时间复杂度:O(lg n) 由于2的n次方为n
空间复杂度: 主要是数组本身的空间
基本思想:假设排序好的数组是升序。当我们想要查找对应key所在数组的位置时,每一次都与数组中间位置的值进行对比: 1. 如果数组中间值大于key那么,要找的值如果存在一定位于数组的前半部分,那么更新hi=mid-1;同时更新mid。
2.如果数组中间值小于key那么,要找的值如果存在一定位于数组的后半部分,那么更新low=mid+1;同时更新mid。
3. 如果mid对应的值等于key,那么返回mid就是要找的位置。
结束条件:1. 找到对应的位置 2.hi<low的时候