10.5 稀疏数组搜索

     《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
     这里讲的也是二分搜索,没什么特别的只是在中值处遇到空字符串时需要将索引移位后再进行比较。

//迭代法
int search(vector<string> strings, string str, int first, int last)
	 {
	     while (first <= last)
		 {
		     int mid = (last + first) / 2;

			 if (strings[mid]=="") 
			 {
			     int left = mid - 1;
				 int right = mid + 1;
				 while (true) 
				 {
				     if (left < first && right > last) 
					 {
						 return -1;
					 }
					 else if (right <= last && strings[right]!="") 
					 {
						 mid = right;
						 break;
					 }
					 else if (left >= first && strings[left] != "") 
					 {
						 mid = left;
						 break;
					 }
					 right++;
					 left--;
				 }
			 }

			int res = strings[mid].compare(str);
			if (res == 0) 
			{ 
				return mid;
			}
			else if (res < 0) 
			{ 
				first = mid + 1;
			}
			else 
			{ 
				last = mid - 1;
			}
		 }
		return -1;
	}
	
//递归法
int search(vector<string> strings, string str,int low,int high)
{
	if (low > high)
		return -1;
	int mid = (low + high) / 2;
	if (strings[mid] == "")
	{
		int left = mid - 1;
		int right = mid + 1;
		while (true)
		{
			if (left<low && right>high)
			{
				return - 1;
			}
			else if (right<=high && strings[right]!="")
			{
				mid = right;
				break;
			}
			else if(left >= low && strings[left] != "")
			{
				mid = left;
				break;
			}
			right++;
			left--;
		}
	}
	if (!strings[mid].compare(str))
	{
		return mid;
	}
	else if (strings[mid].compare(str)<0)
	{
		return search(strings, str, mid+1, high);
	}
	else
	{
		return search(strings, str, low, mid-1);
	}
	
}

int search(vector<string> strings,string str)
{
	if ((strings.size() == 0) || (str == ""))
		return -1;

	return search(strings, str, 0, strings.size()-1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqssss121dfd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值