本章首先講了插入排序演算法, 然後分析了插入排序演算法的時間複雜性,引出了分治法的設計思想,分析了分治演算法。
1. 插入排序
插入排序採用了增量演算法:在排序子陣列a[1...j-1]後,將單個元素a[j]插入到子陣列的適當位置,產生排序好的子陣列a[1....j]。
1package
sort;23
import
util.randomarray;45
public
class
insert
16 array[j + 1] =key;17}
18}1920
public
static
void
main(string arg)
32 }
事先定義了乙個隨機數組的類,方便接下來的排序演算法。
1package
util;23
4public
class
randomarray 12}
1314
public
void
display()
18system.out.println();19}
20 }
插入排序演算法的最好情況是o(n),最壞的情況是o(n^2)。
2. 歸併排序
許多有用的演算法在結構上是遞迴的:為了解決乙個給定的問題,演算法一次或者多次的遞迴呼叫自身一解決緊密相關的若干子問題。這些演算法典型地遵循分治法的思想:將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴地求解這些子問題,然後再合併這些子問題的解來建立原問題的解。
1package
sort;23
import
util.randomarray;45
public
class
merge
1011
public
static
void sort(int array, int left, int
right) 18}
1920
public
static
void merge(int array, int left, int mid, int
right)
30 l[n1] =integer.max_value;
3132
for (int j = 0; j < n2; j++)
35 r[n2] =integer.max_value;
3637
int i = 0;
38int j = 0;
39for (int k = left; k <= right; k++) else47}
48}4950
public
static
void
main(string args)
6364 }
上面的merge方法使用了哨兵的方式,也可以不適用哨兵,**如下:
1//不採用哨兵
2public
static
void merge(int array, int left, int mid, int
right)
1213
for (int j = 0; j < n2; j++)
1617
int i = 0;
18int j = 0;
19for (int k = left; k <= right; k++)
2425
if(j ==n2)
2930
if (l[i] <=r[j]) else37}
38 }
歸併排序的演算法效率為o(n*lgn),但在合併中分配了左右兩個子陣列,犧牲了一定的空間。
第二章 演算法基礎
引言 演算法導論 在本章將向我們介紹乙個演算法設計和分析框架,在後續的章節也將在這個框架的基礎上來分許演算法。名詞解釋 1 偽 偽 就是以最清晰 最簡潔的表示方法來說明演算法,而忽略資料抽象 模組性和錯誤處理的問題 2 迴圈不變式 每次迴圈從陣列a中取出第j個元素插入有序數列a 1 j 1 然後遞增...
第二章 演算法基礎
2.1 插入排序 insertion sort 時間複雜度 o n 對於少量元素的排序,是乙個有效的演算法。為什麼叫插入排序呢?可以模擬撲克牌整牌 將未排序的數字通過遍歷插入到已排好序的數字中的對應位置 如何實現呢 num j 1 key 插入 for int i 1 i n i printf n ...
第二章 演算法
本章內容了解即可。如果大家對資料結構完全不了解,我建議你先去看一下b站上郝斌老師的課程。演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的優先序列,並且每條指令表示乙個或多個操作。只聽資料結構課程,當然可以,但是聽完後你可能沒有什麼感覺,因為你不知道他是幹嘛的。但是如果配合演算法來講解,你就...