插入排序
選擇排序
對數器異或運算
二分法的詳解與拓展
遞迴行為與master公式
執行程式中乙個跟樣本量無關的操作為常數操作,分析時間複雜度就是分析常數操作的個數,然後拋棄掉低階項。
評價演算法先參考時間複雜度然後空間複雜度,最後分析在不同樣本量下程式執行的速度。
給乙個數字序列,5,3,4,2,1 每一輪讓未排好的序列中最大的數放到排好序列的前乙個位置(命名為end),然後重複這個過程,如果沒有這一輪的比較沒有發生交換行為,則可以確定序列有序,退出這個過程
陣列存放待處理的序列,然後一層迴圈控制讓每一輪最大的數放到end這個位置,每一輪交換完end減1,第二層迴圈控制交換,如果當前數比下乙個數大則交換,如果小則不交換。
容易錯的點,如果你的第乙個迴圈想要控制一共交換幾輪的話,那麼end這個位置得計算一下 容易寫錯
時間複雜度 最壞 n2 最好 n ,空間 1
像打撲克牌的摸牌一樣排序,得到乙個數,跟前面排好的序列進行比較找到第乙個比它小的位置插在它的後面
陣列,第一層迴圈控制待排序的元素,從第二個元素開始,第二迴圈控制交換,如果前乙個元素比它小就交換位置,遇到比它大的就停止。把判斷條件放在第二層迴圈的判斷條件中,這樣如果前乙個數比待插入的數小的話就不用再往前找了
跟氣泡排序一樣每一輪遍歷把最大的數放到未排好序序列的最後的位置上,不過氣泡排序是兩兩交換,而選擇排序是選擇乙個數。如果乙個序列有序,選擇排序的時間複雜度還是n2 無法優化
第一層迴圈控制end的位置從arr.length-1到1,然後第二層迴圈遍歷未排好序的陣列從0到end,用乙個變數來儲存遍歷過程中最大的數的索引然後與end交換。注意這裡swap不能使用異或,因為有可能會自己跟自己交換,異或得0然後就gg了
public
static
void
selectionsort
(int
arr)
for(
int end=arr.length-
1;end>
0;end--
)swap
(arr,maxindex,end);}
}
對數器可以產生大量的測試資料然後用來比較你寫的 多個演算法的優劣性,還可以驗證貪心策略,如果沒有判題系統這個是驗證你演算法正確性的利器
public
static
void
process()
public
static
void
compartor()
public
static
void
main
(string[
] args)
} system.out.
println
(succeed ?
"nice!"
:"****ing ****ed!");
}
異或運算 相同為0 不同為1 ,也可以理解為不進製相加
滿**換律和結合律
用二進位制來實際運算一下不進製相加,可以驗證交換律
與0進行異或為自己 與自己進行異或為0
第一題用異或的性質,把所有數異或在一起儲存到乙個變數中,出現偶數次的數相異或結果為0,0異或奇數次的數為結果。(用結合律和0^n=n;n^n=0)
第二題用上面的方法跑一遍結果是a^b,然後根據a不等於b知道a與b必定有乙個位數不同,也就是a^b有一位必為1,然後用下面的方法取出1。
eor = eor &
(~eor+
1)
然後再次遍歷陣列,把特定位為1(或0)的取出,做異或運算能得到a,再與a^b做異或運算,就可以得到b。
private
static
void
process1
(int
arr)
system.out.
println
("the res is "
+eor);}
private
static
void
process2
(int
arr)
int res1 =0;
//找出最右面的1
int rightone = eor &
(~eor+1)
;for
(int cur:arr)
} system.out.
println
("the a is "
+ res1 +
" and the b is "
+(eor ^ res1));
}public
static
void
main
(string[
] args)
;//兩種奇數次數的數
遞迴行為就是把大問題劃分為子問題,這叫遞推,然後解決完子問題把解返回給大問題,這叫回歸。
master公式只適用於等比例劃分子問題的遞迴模型
左神演算法初級班筆記6 字首樹 貪心
arr2中有哪些字元,是作為arr1中某個字串字首出現的?請 列印 arr2中有哪些字元,是作為arr1中某個字串字首出現的?請列印 arr2 現次數最大的字首。不要企圖證明貪心的正確性,想幾個貪心策略之後,用對數器去證明正確的即可。1.按最低字典序拼接字串給定乙個字串型別的陣列strs,找到一種拼...
左神初級班 (二)
實現一種狗貓佇列的結構,要求如下 使用者可以呼叫add方法將cat類或dog類的例項放入佇列中 使用者可以呼叫pollall方法,將佇列中所有的例項按照進佇列的先後順序依次彈出 使用者可以呼叫polldog方法,將佇列中dog類的例項按照進佇列的先後順序依次彈出 使用者可以呼叫pollcat方法,將...
左神演算法初級班3中運用堆結構求解的那個問題 題解
有乙個容器,一次吐出數字,讓你求給定任意時刻所吐出來的數的中位數 分別建立乙個大根堆和乙個小根堆,用來維護排序後的陣列小於中間數字的數 放入大根堆中 和大於中間數字的數 放入小根堆中 當大根堆和小根堆中資料個數相差大於1時,就讓資料多的那個堆中的數跑到資料少中的那個堆中去,這樣能夠保證兩個堆的堆頂的...