1. 程式人生 > 其它 >二分查詢法(暴力拆解法)

二分查詢法(暴力拆解法)

概念

二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。 [百度知道]

分析

1,通過三個數來查詢,開始值(低位置),中間值(mid),末尾值(高位置),下文分別稱low位置,mid值,high位置

2,用你想查詢的key值做比較,
如果key值大於mid值,就把mid值當成開始值(即把mid值賦值給low位置),繼續求平均值,繼續跟提供的值做比較
如果是小於中間值那麼舊把末尾值變成中間值的位置,繼續剛剛的操作,
(如果看不明白,程式碼裡有詳細的分部詳解)

3,二分查詢法相較於冒泡和遞迴來說效率高很多,但缺點也顯而易見,如果陣列中有重複的數字,程式就崩潰了。(因為只能返回一個下標)

例項

例如查詢陣列{5,13,19,21,37,56,64,75,80,88,92}中21的下標在這裡插入圖片描述
1, 先確定low,mid,high的位置(注意這幾個都是下標)
mid=(high+low)/2

2, 用mid位置的值與21比較,21<56

3, 令mid=high-1;(減1的原因是已經知道56不等於21,就可以直接跳到前一個位置,提高效率)

4,此時low指向5,high指向37,再算出mid=(high+low)/2,得到mid指向19,

5,用21和此時的mid值作比較,21>19,

6,所以令mid=low+1;(加1為提高效率)

7,在比較就得到mid = low = 21 了 ,就是下圖這樣

在這裡插入圖片描述

程式碼

#include<stdio.h>
void main()
{
	int ar[] = { 1, 23, 45, 65, 76, 87, 445, 77765, 34535, 234222, 999999 };
	int n = sizeof(ar) / sizeof(ar[0]);
	int key;
	printf("請輸入要查詢的key值:>");
	scanf("%d",&key);
	int low = 0;
	int high = n - 1;      //高位置例如999999他的下標是10,而n為11,則高位置應該等於最後一個數字的下標即n-1
int mid, index = -1; //index是一個索引,初始化為-1沒有什麼意義,後面用作結果輸出 while (low <= high) { mid = (low + high) / 2; if (key == ar[mid]) { index = mid; break; } else if (key < ar[mid]) { high = mid - 1; } else low = mid + 1; } if (index == -1) printf("要查詢的%d不存在。。。\n",key); else printf("要查詢的%d的下標為%d",key,index); // //二分查詢(有序的) 前提是陣列有序!!! // low位置,mid位置,high位置,key值, (前三個都是下標,key是真值,注意ar[low]和low的區別) //開始查詢 // mid = (low + high)/2 ; // if(ar[mid]==key) -->查詢成功,輸出key值=mid值=…… // if(ar[mid]< key) -->令mid=high+1,繼續查詢(再迴圈) // if(ar[mid]> key) -->令mid=low-1, 繼續查詢(再迴圈)//-1沒有其實也可以,但是有了會提高效率 /// }