折半查找,喔~折半查找

本文的嘗試還是源於July大神的一片文章:見此:http://blog.csdn.net/v_july_v/article/details/7093204

文中提到, Jon Bentley說90%以上的程序員無法正確無誤的寫出二分查找代碼。

不覺深以爲然~~~

因爲本科找工作時,面過一家公司,面官讓寫出折半查找的C++實現。

算法很簡單,過程很清晰,不禁暗喜,這題so easy啊。。

但是寫着寫着才發現,雖然算法過程在腦子裏異常清晰,但是落到代碼上卻是漏洞百出,邏輯混亂。。。

歸根到底還是編碼練的太少。。

由此發現,很多算法只有感性的認識是完全不夠的,因爲實現過程中有很多細節是容易忽略或弄混的。

算法要自己親手實現一下,並把實現過程中自己碰到的錯誤、疑問記錄下來分析,才能對算法有更深刻的認識。。

以下是我的兩個實現,一個用循環,一個用遞歸。遞歸實現很不規範。

很可能有錯誤,大家謹慎參考,歡迎批評指正~~~~

int search_loop(int *data,int count,int value)
{
	int middle,low=0,high=count;
	while(low<=high)
	{
		middle=(high+low)/2;
		//middle=low+(hight-low)/2
		if(data[middle]==value)
		{
			return middle;
		}else
		{
			if(value>data[middle])
			{
				low=middle+1;
			}else
			{
				high=middle-1;
			}
		}
	}
	return -1;
}


void search_recursion(int *data,int count,int value)
{
	int middle=count/2;
	if(value==(data[middle]))
	{
		printf("success\n");
		return;
	}
	if(middle==0)
	{
		printf("failure\n");
		return;
	}
	if(value<(data[middle]))
	{
		search_recursion(data,middle-1,value);
		return;
	}
	if(value>(data[middle]))
	{
		search_recursion(data+middle+1,count-middle-1,value);
		return;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章