1. 程式人生 > >考研路_資料結構_查詢1_順序查詢和二分查詢

考研路_資料結構_查詢1_順序查詢和二分查詢

資料結構常用查詢演算法_順序查詢

順序查詢:在一個已知無(或有序)序佇列中找出與給定關鍵字相同的數的具體位置。原理是讓關鍵字與佇列中的數從第一個開始逐個比較,直到找出與給定關鍵字相同的數為止。

C語言實現:

int Linear_Search1(int *a, int n, int key) 
{
	//從序列表中查詢為key的關鍵值,成功則返回其下標值,否則查詢失敗,返回-1
	int i;
	for(i==1; i<=n; i++) 
	{
		if(a[i] == key) 
		{
			return i;
		}
	}
	return 0;
}


上述順序查詢程式碼中,並未最優化的,因為每次迴圈時都需要對i,進行越界判斷(;i<=n;),為避免重複判斷,可用哨兵法。程式碼如下:

int Linear_Search2(int *a, int n, int key) 
{
	int i;
	a[0] = key;          /*將關鍵值key賦值給a[0],即設定“哨兵”*/
	i = n;
	while(a[i] != key) 
	{
		i--;
	}
	return i;            /*返回0則說明未找到關鍵值key*/
}

Linear_Search2程式碼詳解:

該段程式碼從尾部n開始查詢,將a[0]賦值為key,若在查詢過程中,成功找到key值,則返回其下標i,若無法找到,則i的值等於0。

“哨兵”法:在查詢前設定哨兵,可避免查詢過程的每次的溢位判斷,在總資料較多時有效的改善了Linear_Search1的方法。

java語言實現:

public class LinearSearch {
	public int getIndex(int[] arr, int key) {
		int i;
		for(i=0; i<arr.length; i++) {
			if(arr[i] == key)
				return i;
		}
		return -1;
	}
}

這是個迭代過程,從陣列下標為0到陣列下標最大值,若找到給定關鍵值,則返回該值在陣列中的位置,否則查詢失敗,時間複雜度為O(n)。

資料結構常用查詢演算法_二分查詢

二分查詢又稱折半查詢:每次選取剩下一半的中間進行查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。

C語言實現:

int Binary_Search(int *a, int n, int key) 
{
	int low = 0;                        /*設定下區間*/
	int high = n;                       /*設定上區間*/
	if(a[low] == key)                   /*判斷是否為上下端點*/
		return low;
	if(a[high] == key)
		return high;
	while(low <= high)
	{
		int mid = low + (high - low)/2; /*避免((low+high)/2)中(low+high)的結果溢位,即值大於資料型別所能表達的最大值*/
		if(a[mid] == key)               /*查詢到關鍵值並返回其下標值*/
			return mid;
		else if(a[mid] < key) 
			low = mid + 1;              /*中間值比關鍵值小,則把中間值加1賦值給下一輪的下區間*/
		else 
			high = mid - 1;             /*中間值比關鍵值大,則把中間值減1賦值給下一輪的上區間*/
	}
}

java語言實現:

public class BinarySearch {
	public int getIndex(int[] arr, int key) {
		int low = 0;            //下區間
		int high = arr.length-1;//上區間
		while(low <= high) {    
			int mid = (low + high)/2;
			if(arr[mid] == key) {
				return mid;     //查詢成功,返回關鍵值在陣列中的位置
			}else if(arr[mid] < key) {
				low = mid + 1;  //中間值比關鍵值小,則把中間值加1賦值給下一輪的下區間
			}else {
				high = mid - 1; //中間值比關鍵值大,則把中間值減1賦值給下一輪的上區間
			}
		}
		return -1;              //查詢失敗
	}
}

二分查詢過程,時間複雜度為O(logn)。