算法(第4版) Chapter 1

Algorithms Fourth Edition
Written By Robert Sedgewick & Kevin Wayne
Translated By 謝路雲java

筆記

二分查找 BinarySearch

public static int indexOf(int key, int[] a) {
        int lo = 0;
        int hi = a.length - 1; // 記住要-1
        int mid;
        while (lo <= hi) { //記住有等號
            mid = (lo + hi) / 2;
            if (key < a[mid])
                hi = mid - 1;
            else if (key > a[mid])
                lo = mid + 1;
            else
                return mid;
        }
        return -1;
    }

練習題

求對數

Exe 1.1.14
編寫一個靜態方法 lg(), 接受一個整型參數N,返回不大於log2(N)的最大整數。不要使用Math庫。算法

public static int lg(int N){
            // m = log a N 
            int a=2; //a爲底數            
            int m=0; 
            for(;N>1;N/=a){ 
                m++;
            }
            return m;
        }

遞歸乘法/乘方

Exe 1.1.18
乘法
函數即爲乘法的遞歸形式,返回值爲a*b
分析:
引入二進制例子
2|4……0
2|2……0
2|1……1
4的二進制表示爲100函數

eg:3*4
   011
*  100
11000code

將b看作二進制,當b的二進制位爲1時,與a相乘。由1的位置決定a乘以幾,依次爲1,2,4,8,16,...,2^n。將各個乘積累加起來。
(相似於十進制的乘法運算方式,不一樣位置的乘法依次會乘以1,10,100,1000,...,10^n,最後累加)
代碼思想:
1.循環判斷
大循環
判斷b的二進制位是否爲1{如果,sum+=a;若不是,不須要作任何操做,由於加0不影響}
a=a*2
繼續看更高一位,直到看完。
return sum。
(相似於綜合法)遞歸

public static int multi(int a, int b) {
        int isys = 4; //n進制
        int sum=0; //這個不能寫在for裏面,由於for裏面聲明的爲局部變量。
        for (; b != 0; b /= isys) {
            if (b % isys != 0) {
                sum += a * (b % isys);
            }
            a *= isys;
        }
        return sum;
    }

2.遞歸算法
遞歸算法就是return 本次結果+用另外的參數調用本身。
(相似於分析法,抽絲剝繭回去)it

public static int multi2(int a, int b)
    {
        if (b == 0) return 0;
        if (b % 2 == 0) return multi(2*a, b/2);
        return multi(2*a, b/2) + a;
    }

乘方的遞歸形式io

public static int power(int a, int b)
    {
        if (b == 0) return 1;
        if (b % 2 == 0) return power(a*a, b/2);
        return power(a*a, b/2) * a;
    }

交換

用異或的方式交換兩個變量,不使用第三個變量,節省一個空間。
然而這個函數方法自己並無用,由於方法中若傳遞參數爲基本型(如int),在方法中對其值的改變並不會在主函數中產生影響。class

public static void exch(int a, int b){
        a=a^b;
        b=a^b;
        a=a^b;
    }

待補充

局部變量;全局變量;靜態變量變量

相關文章
相關標籤/搜索