在计算机科学中,折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*
2
名称:二分查找
3
时间复杂度:O(lg (n))
4
*/
5
#include <iostream>
6
#include <time.h>
7
#include <stdlib.h>
8
using namespace std;
9
void mergeSort(int*, int);
10
void __mergeSort(int*, int, int);
11
void merge(int*, int, int, int);
12
int binarySearch(int*, int, int);
13
int main(void)
14![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
15
int n;
16
int *array;
17![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
srand(time(NULL)); /**//*void srand(unsigned seed);*/
18
while (true)
19![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
20
cin >> n;
21
array = new int[n];
22![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*随机生成数组*/
23
for (int i = 0; i < n; ++i)
24![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
25![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
array[i] = rand() % 100; /**//*int rand(void);*/
26
}
27![](/Images/OutliningIndicators/InBlock.gif)
28![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*排序前*/
29
for (int i = 0; i < n; ++i)
30![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
31
cout << array[i] << ' ';
32
}
33
cout << endl;
34![](/Images/OutliningIndicators/InBlock.gif)
35![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*归并排序*/
36
mergeSort(array, n);
37![](/Images/OutliningIndicators/InBlock.gif)
38![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*排序后*/
39
for (int i = 0; i < n; ++i)
40![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
41
cout << array[i] << ' ';
42
}
43
cout << endl;
44![](/Images/OutliningIndicators/InBlock.gif)
45![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*二分查找*/
46
int value;
47
cin >> value;
48
cout << binarySearch(array, n ,value) << endl;
49
delete array;
50
}
51
return 0;
52
}
53
void mergeSort(int* array, int length)
54![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
55
__mergeSort(array, 0, length - 1);
56
}
57
void __mergeSort(int* array, int first, int last)
58![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
59![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*只有有两个元素*/
60
if (first < last)
61![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
62
int middle = first + (last - first) / 2;
63
__mergeSort(array, first, middle);
64
__mergeSort(array, middle + 1, last);
65
merge(array, first, middle, last);
66
}
67
}
68
void merge(int* array, int first, int middle, int last)
69![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
70
int* temp = new int[last - first + 1];
71
int i = first;
72
int j = middle + 1;
73
int k = 0;
74
while (i <= middle && j <= last)
75![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
76![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*取较小者*/
77
if (array[i] <= array[j])
78![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
79
temp[k] = array[i];
80
++i;
81
}
82
else
83![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
84
temp[k] = array[j];
85
++j;
86
}
87
++k;
88
}
89![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*前半部分没有复制完*/
90
if (i <= middle)
91![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
92
while (i <= middle)
93![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
94
temp[k] = array[i];
95
++i;
96
++k;
97
}
98
}
99![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*后半部分没有复制完*/
100
if (j <= last)
101![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
102
while (j <= last)
103![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
104
temp[k] = array[j];
105
++j;
106
++k;
107
}
108
}
109![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*复制回原数组*/
110
for (int p = first, q = 0; p <= last; ++p, ++ q)
111![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
112
array[p] = temp[q];
113
}
114![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*释放内存*/
115
delete temp;
116
}
117
int binarySearch(int* array, int length, int value)
118![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
119
int left = 0;
120
int right = length - 1;
121
while (left <= right)
122![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
123
int middle = left + ((right - left) >> 1);
124
if (array[middle] < value)
125![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
126
left = middle + 1;
127
}
128
else if (array[middle] > value)
129![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
130
right = middle - 1;
131
}
132
else
133![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
134
return middle;
135
}
136
}
137
return -1;
138
}
139![](/Images/OutliningIndicators/None.gif)
posted on 2012-10-21 23:48
zhuxin 阅读(75)
评论(0) 编辑 收藏 引用 所属分类:
数据结构和算法