• 基础算法——查找


    /*************************************************************************
        > 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;
    }
  • 相关阅读:
    关于Windows 8 用户使用习惯调查结果
    Silverlight 可能迎来新版本
    项目总结(1)集中处理上下文
    VSS 团队 沟通
    中国程序员的迷茫?中国软件行业的悲哀?
    开始学点System.Net NameSpace的Class拉
    .Net FSO简单小结(简单到不能再简单了)
    DotNet Framework不协调的一面 ??
    几个开源项目配置信息的存储和处理的方式
    我对委托的一点理解,欢迎斧正
  • 原文地址:https://www.cnblogs.com/yiyi-xuechen/p/4858748.html
Copyright © 2020-2023  润新知