一,基本问题
给一个有序大数组,求某个数字最左出现的位置,或最右出现的位置。
基本思想是利用二分查找算法,
先利用二分查找算法找到首次出现的位置,
如果找最左位置则,记录上次搜索到的位置,循环搜索从左边界到上次出现的位置左边一个位置中的给定数据,直到找不到为止,输出记录的上次位置
如果找最右位置则,记录上次搜索到的位置,循环搜索从右边界到上次出现的位置右边一个位置中的给定数据,直到找不到为止,输出记录的上次位置
2,代码
/*************************************************************************
> File Name: getpos.cpp
> Author:18510665908@163.com
> Created Time: 2018年04月13日 星期五 19时17分30秒
************************************************************************/
#include<iostream>
using namespace std;
int binary_search(int data[],int begin,int end,int num)
{
int left = begin;
int right = end;
int mid = -1;
int pos = -1;
while(left<=right)
{
mid = (left+right)/2;
if (data[mid]<num)
{
left = mid+1;
}
else if (data[mid]>num)
{
right = mid-1;
}
else if (data[mid]==num)
{
break;
}
}
if (left<=right)
pos = mid;
return pos;
}
int getPos(int data[],int len,int num)
{
int left=0,right=len-1;
int curpos=-1,prepos=-1;
curpos=binary_search(data,left,right,num);
while(curpos!=-1)
{
prepos=curpos;
#if 0
//计算后边位置
left=curpos+1;
right=right;
#else
left=left;
right=curpos-1;
#endif
curpos=binary_search(data,left,right,num);
}
return prepos;
}
int main(int argc,char *argv[])
{
int data[]={
0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,7,7,7,7,7,7
};
cout<<endl<<getPos(data,50,1)<<endl;
return 0;
}
大数组查左连界