/****************************/
/* 二分探索 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include "MT.h"
using namespace std;
/*************************/
/* データの比較(昇順) */
/* bsearch 用 */
/*************************/
int compare_n(const void *arg1, const void *arg2)
{
int *a1 = (int *)arg1;
int *a2 = (int *)arg2;
return *a1 - *a2;
}
/**************************************/
/* 二分探索( Binary Search ) */
/* key : 探索するキーデータ */
/* data : データ */
/* n : データ数 */
/* return : 1 : 見つかった */
/* 0 : 見つからなかった */
/**************************************/
bool search(int key, int *data, int n)
{
int sw = 0, left = 0, right = n-1, center;
if (data[right] > data[left]) {
while (left < right) {
center = (left + right) / 2;
if (data[center] < key)
left = (center < n-1) ? center + 1 : center;
else
right = center;
}
}
else {
while (left < right) {
center = (left + right) / 2;
if (data[center] > key)
left = (center < n-1) ? center + 1 : center;
else
right = center;
}
}
if (data[left] == key)
sw = 1;
return sw;
}
#define N 5000000
int main()
{
// 初期設定
int s[100000], n = 0;
int *data = new int [N];
init_genrand((unsigned)time(NULL));
// データの設定
clock_t tm1 = clock();
for (int i1 = 0; i1 < N; i1++) {
data[i1] = genrand_int31();
if (i1%50 == 0 && n < 100000) {
s[n] = data[i1];
n++;
}
}
clock_t tm2 = clock();
printf("保存: %d ms\n", (int)(tm2-tm1));
// データのソート
sort(data, data+N);
clock_t tm3 = clock();
printf("sort: %d ms\n", (int)(tm3-tm2));
// データの探索
for (int i1 = 0; i1 < n; i1++) {
int sw = search(s[i1], data, N);
if (sw == 0) {
printf("***error*** データが見つからない!\n");
exit(1);
}
}
clock_t tm4 = clock();
printf(" 探索: %d ms\n", (int)(tm4-tm3));
// データの探索(標準関数 bsearch の利用)
for (int i1 = 0; i1 < n; i1++) {
int *sw = (int *)bsearch(&s[i1], data, N, sizeof(int), compare_n);
if (sw == NULL) {
printf("***error*** データが見つからない!\n");
exit(1);
}
}
clock_t tm5 = clock();
printf(" 探索(bsearch): %d ms\n", (int)(tm5-tm4));
// データの探索(C++ 標準ライブラリ binary_search の利用)
for (int i1 = 0; i1 < n; i1++) {
bool sw = binary_search(data, data+N, s[i1]);
if (!sw) {
printf("***error*** データが見つからない!\n");
exit(1);
}
}
clock_t tm6 = clock();
printf(" 探索(binary_search): %d ms\n", (int)(tm6-tm5));
return 0;
}