基础算法——查找

/*************************************************************************
    > File Name: search.cpp
    > Author: xinyang
    > Mail: [email protected]
    > 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;
}
时间: 2024-08-01 10:44:07

基础算法——查找的相关文章

基础算法-查找:线性索引查找

前面介绍的几种查找的算法都是基于数据有序的基础上进行的.但是在实际的应用中,很多数据集的可能有竟然的数据量,面对这些海量的数据,要保证记录全部按照当中的某个关键字有序,其时间代价是非常昂贵的,所以这种数据通常都是按先后顺序存储的. 那么如何能够快速的查找到需要的数据呢?办法就是--索引. 索引就是把一个关键字与它对应的记录相关联的过程.一个索引有若干个索引项构成,每个索引项至少应包括关键字和对应的记录在存储器中的位置等信息. 索引按照结构可以分为线性索引.树形索引和多级索引.所谓的线性索引就是将

基础算法-查找:折半查找

折半查找 又称为二分查找.这种查找方法要求查找表的数据是线性结构保存,并且还要求查找表中的数据是按关键字由小到大有序排列. 折半查找(二分查找)是一种简单而又高效的查找算法,其查找长度至多为㏒2n+1(判定树的深度),平均查找长度为㏒2(n+1)-1,效率比顺序查找要高,但折半查找只能适用于顺序存储有序表(如对线性链表就无法有效地进行折半查找). 经典非递归算法实现 int Binary_Search(int search_table[], int key, int low ,int high)

基础算法-查找:插值查找

算法描述 先来看一个实际问题:我们在一本英汉字典中寻找单词“worst”,我们决不会仿照对半查找(或Fibonacci查找)那样,先查找字典中间的元素,然后查找字典四分之三处的元素等等. 事实上,我们是在所期望的地址(在字典的很靠后的地方)附近开始查找的,我们称这样的查找为插值查找. 可见,插值查找不同于前面讨论的几种查找算法,前面介绍的查找算法是基于严格比较的,即假定我们对线性表中元素的分布一无所知(或称没有启发式信息). 然而实际中,很多查找问题所涉及的表满足某些统计的特点. 插值查找在实际

基础算法之排序--快速排序

1 /************************************************************************************** 2 * Function : 快速排序 3 * Create Date : 2014/04/21 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 7 * 任何单位和个人不经本人允许不

PHP基础算法

1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++){ for($j=0;$j<=3-$i;$j++){ echo ' '; } for($k=0;$k<=2*$i;$k++){ echo '*'; } echo '<br/>'; } 2.冒泡排序,C里基础算法,从小到大对一组数排序. 思路:这题从小到大,第一轮排最小,第二轮排第二小

有动态示意图!程序员必须知道的10大基础算法讲解

目录: 算法一:快速排序算法 算法二:堆排序算法 算法三:归并排序 算法四:二分查找算法 算法五:BFPRT(线性查找算法) 算法六:DFS(深度优先搜索) 算法七:BFS(广度优先搜索) 算法八:Dijkstra算法 算法九:动态规划算法 算法十:朴素贝叶斯分类算法 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n

c/c++面试总结---c语言基础算法总结2

算法是程序设计的灵魂,好的程序一定是根据合适的算法编程完成的.所有面试过程中重点在考察应聘者基础算法的掌握程度. 上一篇讲解了5中基础的算法,需要在面试之前熟练掌握,本篇讨论剩余的基础算法. 先看一个面试题目:设计一个函数,求一个给定字符串中所有数字的和. 例如:给定字符串 “abc12fas123dfaf34”, 计算结果为:12 + 123 + 34 = 169 其中包括了:求和方法.字符串遍历方法.数字字符转成数字的方法 多位数字组合成整数的方法 必须熟练掌握以上四种基础算法,才能解决该问

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

算法录 之 基础算法

这一篇文章主要说说一些基础算法,这些算是很多其他算法的基石. 主要包括  模拟,暴力,枚举,递归,贪心,分治. 1,模拟: 顾名思义,模拟就是...饿,模拟,有一些题目就是给你一些步骤,然后你写代码一步步去模拟那些步骤就行.这类题目主要属于基础题,但是当然如果需要模拟的步骤足够恶心的话,还是比较麻烦的... 具体模拟的例子在之后的练习中会遇到的,按照题目要求一步步做就行,一般算法难度比较小. 2,暴力: 顾名思义,暴力就是...饿,暴力.比如说题目让从平面上的10个点中取三个点,让他们形成的三角