Binary Search可以说是最简单的排序了,看书发现其实有两种Binary Search,一般常见的那种效率稍微低一点点。
直接看看两个我认为比较简单的程序(还有两种我有点看不惯),比较了两种方法的时间
binary_search_0(int v, int a[], int n)在while循环中要做两次检测
binary_search_0(int v, int a[], int n)在while循环中只做一次检测
int main(void) {
int index;
clock_t time_taken;
int a[INTS_LENGTH];
int i;
for(i = 0; i < INTS_LENGTH; i++) {
a[i] = i;
}
int n = -1;
//Test time binary_search_0
for(i = 0, time_taken = clock(); i < INTS_LENGTH; i++) {
index = binary_search_0(n, a, INTS_LENGTH);
}
time_taken = clock()-time_taken;
if(index < 0) {
printf("%d not found!/n", n);
} else {
printf("%d found at index %d/n", n, index);
}
printf("binary_search_0 took %ul clocks(%ul seconds)/n",
(unsigned long)time_taken,
(unsigned long)(time_taken/CLOCKS_PER_SEC));
//Test time binary_search_1
for(i = 0, time_taken = clock(); i < INTS_LENGTH; i++) {
index = binary_search_1(n, a, INTS_LENGTH);
}
time_taken = clock()-time_taken;
if(index < 0) {
printf("%d not found!/n", n);
} else {
printf("%d found at index %d/n", n, index);
}
printf("binary_search_1 took %ul clocks(%ul seconds)/n",
(unsigned long)time_taken,
(unsigned long)(time_taken/CLOCKS_PER_SEC));
return 0;
}
int binary_search_0(int v, int a[], int n){
int low, high, mid; low = 0;
high = n-1;
while(low <= high) {
mid = (low+high)/2;
if(a[mid] < v) {
low = mid+1;
} else if(a[mid] > v) {
high = mid-1;
} else {
return mid;
}
}
return -1;
}
int binary_search_1(int v, int a[], int n) {
int low, high, mid;
low = 0;
high = n - 1;
mid = (high+low)/2;
while(low <= high && v != a[mid]) {
if(a[mid] > v) {
high = mid - 1;
} else {
low = mid + 1;
}
mid = (high+low)/2;
}
if(v == a[mid]) {
return mid;
} else {
return -1;
}
}