查找算法代碼實現彙總

  • Get up. Keep moving.
    站起來,繼續前進。

一、順序查找

/* 無哨兵順序查找,a爲數組,n爲要查找的數組個數,key爲要查找的關鍵字 */
int Sequential_Search(int *a,int n,int key)
{
	int i;
	for(i=1;i<=n;i++)
	{
		if (a[i]==key)
			return i;
	}
	return 0;
}
/* 有哨兵順序查找,不用比較i,效率會高一點 */
int Sequential_Search2(int *a,int n,int key)
{
	int i;
	a[0]=key;
	i=n;
	while(a[i]!=key)
	{
		i--;
	}
	return i;
}

二、折半查找(二分查找)

中間值計算的基本公式如下:
在這裏插入圖片描述
C語言實現如下:

/***************************
* 功能:折半查找(二分查找) 
* 時間複雜度:O(logn)
* 輸入:
* 	a -- 數組(數據集查找表)
* 	n -- 數據集大小
* 	key -- 要查找的元素
* 輸出:
* 	查找的元素在數據集a中的位置
***************************/
int Binary_Search(int *a,int n,int key)
{
	int low,high,mid;
	low = 0;	/* 定義最低下標爲記錄首位 */
	high = n-1;	/* 定義最高下標爲記錄末位 */
	
	while(low <= high)
	{
		mid = (low+high)/2;		/* 折半 */
		if (key < a[mid])		/* 若查找值比中值小 */
			high = mid-1;		/* 最高下標調整到中位下標小一位 */
		else if (key > a[mid])/* 若查找值比中值大 */
			low = mid+1;		/* 最低下標調整到中位下標大一位 */
		else
		{
			return mid;		/* 若相等則說明mid即爲查找到的位置 */
		}
	}
	
	return -1;
}

三、插值查找

對摺半查找優化,其計算中間值的基本公式如下:
在這裏插入圖片描述

/* 插值查找 */
/* 注:該代碼默認查找集的有效數據從位置1開始,位置0的值無效 */
int Interpolation_Search(int *a,int n,int key)
{
	int low,high,mid;
	low=1;	/* 定義最低下標爲記錄首位 */
	high=n;	/* 定義最高下標爲記錄末位 */
	while(low<=high)
	{
		mid=low+ (high-low)*(key-a[low])/(a[high]-a[low]); /* 插值 */
		if (key<a[mid])		/* 若查找值比插值小 */
			high=mid-1;		/* 最高下標調整到插值下標小一位 */
		else if (key>a[mid])/* 若查找值比插值大 */
			low=mid+1;		/* 最低下標調整到插值下標大一位 */
		else
			return mid;		/* 若相等則說明mid即爲查找到的位置 */
	}
	return 0;
}

四、斐波那契查找

利用斐波那契數列實現的黃金分割率來確定中間值。

/* 斐波那契查找 */
/* 注:該代碼默認查找集的有效數據從位置1開始,位置0的值無效 */
int Fibonacci_Search(int *a,int n,int key)
{
	int low,high,mid,i,k=0;
	low=1;	/* 定義最低下標爲記錄首位 */
	high=n;	/* 定義最高下標爲記錄末位 */
	while(n>F[k]-1)
		k++;
	for (i=n;i<F[k]-1;i++)
		a[i]=a[n];
	
	while(low<=high)
	{
		mid=low+F[k-1]-1;
		if (key<a[mid])
		{
			high=mid-1;		
			k=k-1;
		}
		else if (key>a[mid])
		{
			low=mid+1;		
			k=k-2;
		}
		else
		{
			if (mid<=n)
				return mid;		/* 若相等則說明mid即爲查找到的位置 */
			else 
				return n;
		}
		
	}
	return 0;
}
發佈了251 篇原創文章 · 獲贊 168 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章