折半查找法:
折半查找法是效率較高的一種查找方法。假設有已經按照從小到大的順序排列好的五個整數num[0]~num[4],要查找的數是key,其基本思想是: 設查找數據的範圍下限爲low=0,上限爲high=5,求中點mid=(low+high)/2,用key與中點元素a[mid]比較,若key==a[mid],即找到,中止查找;不然,若key>a[mid],替換下限low=mid+1,到下半段繼續查找;若key<a[mid],換上限high=mid-1,到上半段繼續查找;如此重複前面的過程直到找到或者low>high爲止。若是low>high,說明沒有此數,打印找不到信息,程序結束。數組
代碼實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
/*
定義一個折半查找法函數,查找一個數組元素無順序的數組中的某個值的角標.
*/
#include <stdio.h>
/**
* 冒泡排序函數
*
* @param arr 須要被排序的數組名
* @param len 數組的長度
*/
void
bubbleSort
(
int
arr
[
]
,
int
len
)
{
for
(
int
i
=
0
;
i
<
len
-
1
;
i
++
)
{
for
(
int
j
=
0
;
j
<
len
-
1
-
i
;
j
++
)
{
if
(
arr
[
j
]
>
arr
[
j
+
1
]
)
{
arr
[
j
]
=
arr
[
j
]
^
arr
[
j
+
1
]
;
arr
[
j
+
1
]
=
arr
[
j
]
^
arr
[
j
+
1
]
;
arr
[
j
]
=
arr
[
j
]
^
arr
[
j
+
1
]
;
}
}
}
}
/**
* 折半查找函數
*
* @param arr 要被查找的數組名
* @param len 要唄查找的數組的長度
* @param key 要查找的值
*
* @return 若是查到則返回角標,查不到返回-1
*/
int
Czhao
(
int
arr
[
]
,
int
len
,
int
key
)
{
//定義三個變量,low表示最小角標,high表示最大角標,mid假設爲要查找的數的角標
int
low
=
0
,
high
=
len
-
1
,
mid
;
while
(
low
<=
high
)
{
//計算mid的值,也就是計算角標
mid
=
(
low
+
high
)
/
2
;
//判斷key和arr[mid]的值
if
(
key
>
arr
[
mid
]
)
{
//當要查的值大於中間值,說明要查的值在中間值和最大值之間,則最小角標等於中間角標+1後繼續計算新的mid值
low
=
mid
+
1
;
}
else
if
(
key
<
arr
[
mid
]
)
{
//當要查的值小於中間值,說明要查的值在最小值和中間值之間,則最大角標等於中間角標-1後繼續計算新的mid值
high
=
mid
-
1
;
}
else
{
//當要查的值等於中間值,則直接返回角標
return
mid
;
}
}
//查找不到,返回-1
return
-
1
;
}
int
main
(
int
argc
,
const
char
*
argv
[
]
)
{
//定義一個長度爲5的int類型的數組,並賦值
int
num
[
5
]
=
{
3
,
1
,
5
,
7
,
5
}
;
//調用冒泡排序函數,對數組進行排序
bubbleSort
(
num
,
5
)
;
//調用折半查找函數,並將返回值賦值給n
int
n
=
Czhao
(
num
,
5
,
5
)
;
//打印角標
printf
(
"要查找的元素的角標爲:%d\n"
,
n
)
;
return
0
;
}
|