基础算法——查找

/*************************************************************************
    > File Name: search.cpp
    > Author: xinyang
    > Mail: xuechen.xy@gmail.com 
    > Created Time: Tue 06 Oct 2015 03:22:35 PM CST
 ************************************************************************/

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

/*
 * 顺序查找
 */
bool search(int A[], int n, int x) {
    if (A == NULL || n <= 0) {
        return false;
    }

    for (int i = 0; i < n; ++i) {
        if (A[i] == x) {
            return true;
        }
    }

    return false;
}

/*
 * 二分查找
 */
bool binary_search(int A[], int n, int x) {
    if (A == NULL || n <= 0) {
        return false;
    }

    int low = 0, high = n - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (A[mid] == x) {
            return true;
        } else if (A[mid] > x) {
            high = mid - 1;
        } else {
            low = mid + 1;
        }
    }
}

/*
 * 一个矩阵从左到右、从上到下递增,
 * 判断一个数是否存在于该矩阵中
 */
bool find_k(int *matrix, int columns, int rows, int x) {
    if (matrix == NULL || columns <= 0 || rows <= 0) {
        return false;
    }

    int row = 0, column = columns - 1;
    while (row < rows && column >= 0) {
        if (matrix[column + row * columns] == x) {
            return true;
        } else if (matrix[column + row * columns] > x) {
            --column;
        } else {
            ++row;
        }
    }
    return false;
}

/*
 * 旋转数组中的最小值
 */
int min_in_order(int A[], int low, int high) {
    int ret = A[low];
    for (int i = low + 1; i <= high; ++i) {
        if (A[i] < ret) {
            ret = A[i];
        }
    }
    return ret;
}

int min(int A[], int n) {
    if (A == NULL || n <= 0) {
        cout << "invalid parameters" << endl;
        return -1;
    }

    int low = 0, high = n - 1;
    int mid = low;
    while (A[low] >= A[high]) {
        if (high - low == 1) {
            mid = high;
            break;
        }

        mid = (low + high) / 2;
        if (A[low] == A[mid] 
                && A[mid] == A[high]) {
            return min_in_order(A, low, high);
        }

        if (A[mid] >= A[low]) {
            low = mid;
        } else if (A[mid] <= A[high]) {
            high = mid;
        }
    }
    return A[mid];
}

/*
 * 数组中重复的数字
 */
bool dup1(int A[], int n, int &dup) {
    bool has_dup = false;
    if (A == NULL || n <= 0) {
        return has_dup;
    }

    for (int i = 0; i < n; ++i) {
        if (A[i] < 0 || A[i] > n - 1) {
            return has_dup;
        }
    }

    for (int i = 0; i < n; ++i) {
        while (A[i] != i) {
            if (A[i] == A[A[i]]) {
                dup = A[i];
                has_dup = true;
                return has_dup;
            } else {
                int tmp = A[i];
                A[i] = A[tmp];
                A[tmp] = tmp;
            }
        }
    }
    return has_dup;
}

bool dup2(int A[], int n, int &dup) {
    if (A == NULL || n <= 0) {
        return false;
    }

    for (int i = 0; i < n; ++i) {
        if (A[i] < 0 || A[i] > n - 1) {
            return false;
        }
    }

    map<int, int> M;
    for (int i = 0; i < n; ++i) {
        if (M.count(A[i]) == 1) {
            dup = A[i];
            return true;
        } else {
            M[A[i]] = 1;
        }
    }

    return false;
}

int main() {
    int A[] = {
        1, 2, 8, 9,
        2, 4, 9, 12,
        4, 7, 10, 13,
        6, 8, 11, 15
    };

    sort(A, A + 16);
    cout << "find x in a sorted array" <<endl;
    if (true == binary_search(A, 16, 7)) {
        cout << "yes" << endl << endl;
    } else {
        cout << "no" << endl << endl;
    }

    cout << "find x in an array" << endl;
    if (true == search(A, 16, 7)) {
        cout << "yes" << endl << endl;
    } else {
        cout << "no" << endl << endl;
    }
            
    cout << "find x in a special matrix" << endl;
    if (true == find_k(A, 4, 4, 7)) {
        cout << "yes" << endl << endl;
    } else {
        cout << "no" << endl << endl;
    }

    int B[] = {1, 1, 0, 1, 1};
    // int B[] = {4, 5, 1, 2, 3};
    cout << "find minimum in a rotated array" << endl;
    cout << min(B, 5) << endl << endl;

    int dup = -1;
    // if (true == dup1(B, 5, dup)) {
    if (true == dup2(B, 5, dup)) {
        cout << "duplication: " << dup << endl << endl;
    } else {
        cout << "no duplication" << endl << endl;
    }

    return 0;
}

 

posted @ 2015-10-07 15:19  yiyi_xuechen  Views(185)  Comments(0Edit  收藏  举报