演算法學習 1

2021-07-26 04:37:44 字數 820 閱讀 3668

插入排序是學習演算法時最先學到的乙個演算法,很簡單,也許看一遍就會理解,從而覺得自己掌握這個基本的演算法。但是很多人可能會像我一樣,過了一段時間,提筆來寫一下插入排序的偽**,就很難寫出書本上如此優雅的偽**。

insertion_sort(a):

for j=2 to a.length

key=a[j]

//insert a[j] to a[1,..,j-1]

i = j-1

while i > 0

anda[i] > key

a[i+1] = a[i]

i = i -1

a[i+1] = key

所以懂跟掌握真是兩回事,要能隨時隨手寫出這幾行**,首先要掌握設計這段**的思想,其次要有清晰的邏輯,我相信偽**寫得漂亮的人,一定是程式設計高手。

插入排序的核心思想是**中注釋,把a[j]插入到已排序的a[1,..,j-1]中後,並保證插入後的a[1,..,j]仍然是排好序的,把這個過程從2迴圈到n,顯然當j為2時a[1,..,j-1]等於a[1]滿足已排好序這個性質,所以當j迭代為n時,將a[n]插入到a[1,..,n-1]後a[1,..,n]就排好序了。書面上把a[1,..,j-1]的這些特性形式地叫迴圈不變式。

用迴圈不變式邏輯很清晰的表明了演算法的正確性

最後是如何簡潔的把乙個值如何正確的插入到已排序的陣列中:

在將a[j]插入到a[1,..,j-1]中時,用乙個迴圈變數i從j-1往前迴圈查詢比a[j]大的值都往後移一位,當遇到比key小的時候終止,並把key插入到迴圈變數後面的位置(i+1)上。

演算法學習 1

劍指offer演算法題 題目描述 給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1,m n 每段繩子的長度記為k 1 k m 請問k 1 x xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。...

演算法學習1

求最大子列和問題 給定n個整數的序列,求最大連續子列和,演算法 求出每乙個子列的和 然後得到最大的和返回 static intmaxsum1 int arr if maxsumreturn maxsum 時間複雜度 t n 3 空間複雜度 o 1 優化1 已經計算過的子列和不需要重複計算,再已經計算...

演算法學習1

因為報名參加了藍橋杯軟體技術大賽,所以,我這段時間也在練習寫演算法方面的題,但這不是主要的,更多的是為自己打下乙個好的基礎,為以後自己找工作做儲備。題目 定義乙個circle類,包含乙個double型的radius屬性代表圓的半徑,乙個findarea 返回圓的面積。定義乙個passobject,在...