1.折半查詢要求是陣列是有序為前提(如果不是有序的不能使用)
2.提及查詢存在兩種情況,要麼資料存不存在要麼存在下標是多少
下面講解折半查詢的思想
首先定義乙個有序陣列
int array[10]
=;1-
10一共有10個資料,將這10個數進行編號,從0開始編號,即0-9;
令left=
0,right=
9,mid=
(left+right)
/2,idx=-1
;idx是什麼?
idx就是當進行查詢以後如果沒有資料的話,那麼這個值永遠就是-
1,如果查詢到資料的話就將mid的值賦給idx。
基本工作做好了以後,現在假設我要查詢9這個數,下面講如何折半查詢
1.計算mid
(一半)的值
這裡mid=
(left+right)/2
=(0+
9)/2
=42.比較array[mid]的值和所要查詢的資料進行比較大小
這裡array[4]
=5<
9,所以將array[
4]左邊的所有資料全部拋棄(包括array[4]
),然後令left=mid+
13.計算新的mid
(一半)的值
這裡mid=
(left+right)/2
=(5+
9)/2
=74.比較array[mid]的值和所要查詢的資料進行比較大小
這裡array[7]
=8<
9,所以將array[
7]左邊的所有資料全部拋棄(包括array[7]
),然後令left=mid+
15.計算新的mid
(一半)的值
這裡mid=
(left+right)/2
=(8+
9)/2
=86.比較array[mid]的值和所要查詢的資料進行比較大小
這裡array[8]
=9=9
(找到)
7.列印出mid的值
//下面是c語言的**(直接複製到main.c裡可以直接執行)
#include
intmain
(void);
int left =0;
int right =9;
int mid;
int idx=-1
;int finddata =4;
//假設這裡我們要查詢的資料是4
while
(left<=right)
else
if(finddata > arr[mid]
) left=mid +1;
else
right=mid -1;
}if(idx ==-1
)printf
("not find data\n");
else
printf
("idx=%d\n"
,mid)
;return0;
}
選擇排序法思想及程式設計實戰
1.如下圖所示,我要進行10個數按照公升序排序 2.核心思想 第一輪比較完以後保證6的位置是最小的 按照公升序 第二輪比較完以後保證2的位置是次最小,以此類推。3.關注細節 這裡我要進行排序的一共是10個數,其中共進行了9輪就可以完成排序。每次j都是比i大1個數。從圖看是兩個for迴圈。下面是c i...
遞迴和分治思想(折半查詢)
1 遞迴 歸去來兮 遞迴效率較低,如果明確知道迭代次數,則能用迭代最好用迭代,遞迴是函式自己呼叫自身,每次呼叫都需要入棧等操作。但是遞迴操作要比迭代簡單和清楚。遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。使用遞迴函式需要注意防止棧溢位。在...
折半查詢的思想及原始碼 常用排序與查詢演算法
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是 第一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小 大 元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。選擇排序是不穩定...