Algorithms Fourth Edition
Written By Robert Sedgewick & Kevin Wayne
Translated By 謝路雲java
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; }
局部變量;全局變量;靜態變量變量