对分查找、欧几里得、冥运算

2018-06-22  本文已影响13人  90后小伙

算法-对分查找(二分查找)C++实现
验证x是否是居中的元素,如果是,则找到答案,如果小于居中元素,那么取左边已排序的子序列,否则取右边已排序的子序列

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

欧几里得算法
欧几里得算法也叫辗转相除法,是求两个整数最大公约数的算法
当然也可以求最小公倍数
算法实现
其实算法的实现原理就是,有整数a b两个,每次求的一个数字r = a % b,然后把b放到a的位置,把r放到b的位置,递归调用。
结束条件是当 a%b == 0的时候停止。

unsigned int gcd(unsigned int m, unsigned int n) {
    unsigned int temp;
    
    if (m < n) {
        n = m + n;
        m = n - m;
        n = n - m;
    }
    
    while (n > 0) {
        temp = m % n;
        m = n;
        n = temp;
    }
    return m;
}

冥运算
取冥的一半,做递归运算,这样就减少了运行时间

long int the_pow(long int x, unsigned int n) {
    if (n == 0) {
        return 1;
    } else if (n == 1) {
        return x;
    } else if (n%2 == 0) {
        return the_pow(x*x, n/2);
    } else {
        return the_pow(x*x, n/2)*x;
    }
}
上一篇下一篇

猜你喜欢

热点阅读