第二章 演算法基礎

2022-08-17 17:42:22 字數 1986 閱讀 7784

本章首先講了插入排序演算法, 然後分析了插入排序演算法的時間複雜性,引出了分治法的設計思想,分析了分治演算法。

1. 插入排序  

插入排序採用了增量演算法:在排序子陣列a[1...j-1]後,將單個元素a[j]插入到子陣列的適當位置,產生排序好的子陣列a[1....j]。

1

package

sort;23

import

util.randomarray;45

public

class

insert

16 array[j + 1] =key;17}

18}1920

public

static

void

main(string arg)

32 }

事先定義了乙個隨機數組的類,方便接下來的排序演算法。

1

package

util;23

4public

class

randomarray 12}

1314

public

void

display()

18system.out.println();19}

20 }

插入排序演算法的最好情況是o(n),最壞的情況是o(n^2)。

2. 歸併排序

許多有用的演算法在結構上是遞迴的:為了解決乙個給定的問題,演算法一次或者多次的遞迴呼叫自身一解決緊密相關的若干子問題。這些演算法典型地遵循分治法的思想:將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴地求解這些子問題,然後再合併這些子問題的解來建立原問題的解。

1

package

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站上郝斌老師的課程。演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的優先序列,並且每條指令表示乙個或多個操作。只聽資料結構課程,當然可以,但是聽完後你可能沒有什麼感覺,因為你不知道他是幹嘛的。但是如果配合演算法來講解,你就...