演算法學習筆記之插入排序

2021-10-02 12:53:25 字數 1702 閱讀 3646

插入排序是一種簡單直觀且穩定的排序演算法。它的工作方式非常像人們排序一手撲克牌一樣,開始時,我們的左手為空並且桌子上的牌面朝下。然後,我們每次從桌子上拿走一張牌並將它插入左手正確的位置,為了找到一張牌的正確位置,我們從右到左將它與已在手中的每張牌進行比較。

需求:排序前:

排序後:

排序原理:

1.把所有的元素分為兩組,已經排序的和未排序的;

2.找到未排序的組中的第乙個元素,向已經排序的組中進行插入;

3.倒敘遍歷已經排序的元素,依次和待插入的元素進行比較,直到找到乙個元素小於等於待插入元素,那麼就把待插入元素放到這個位置,其他的元素向後移動一位。

類名insertion

構造方法

insertion():建立insertion物件

成員方法

1.public static void sort(comparable a):對陣列內的元素進行排序;

2.private static boolean greater(comparable v,comparable w):判斷v是否大於w

3.private static void exch(comparable a,int i,int j):交換a陣列中,索引和索引處的值

插入**實現:

public

class

insertion

else}}

}/*比較v元素是否大於w元素

*/private

static

boolean

greater

(comparable v,comparable w)

/* 陣列元素和j交換位置

*/private

static

void

exch

(comparable[

] a,

int i,

int j)

}

定義個測試類:

public

class

insertiontest

; insertion.

sort

(a);

system.out.

println

(arrays.

tostring

(a));}

}

測試結果:

插入排序使用了雙層for迴圈,其中內層迴圈的迴圈體是真正完成排序的**,所以,我們分析插入排序的時間複雜度,主要分析一下內層迴圈體的執行次數即可。

最壞情況,也就是待排序的陣列元素為,那麼:

比較次數:

(n-1)+(n-2)+(n+3)+…+2+1=((n-1)+1)(n-1)/2=n^2/2-n/2;

交換的次數為:

(n-1)+(n-2)+(n+3)+…+2+1=((n-1)+1)(n-1)/2=n^2/2-n/2;

總執行次數為:

(n2/2-n/2)+n2/2-n/2=n^2-n;

按照大o推導法則,保留函式中的最高端項最終插入排序的時間複雜度為o(n^2)。

演算法學習筆記之插入排序

舉個例子 摸牌的時候,一張張摸,每次處理新摸上來的那一張,一般習慣是從左到右公升序排列,那麼就是每摸上來一張,將摸上來的這張牌與它之前的牌比較大小,找到第一張比它小的牌為止,這時候第一張比它小的牌的右邊那個位置就是新牌該放的位置,對應的,為了空出這個位置給新牌,所有大於新牌的牌都應該往右邊挪乙個位置...

演算法學習之插入排序

1.演算法思想 alg s idea 從左至右有序 第乙個位置只有乙個元素,當然有序 每次2 j n 將元素aj插入到有序的a 1.j 1 中,並使a 1.j 有序 直至j n 2.alg偽 類c,不可複製直接執行 insertion sort a 將a 1.n 有序 for j 2 to n do...

演算法學習之插入排序

插入排序是一種最簡單的排序方法,對於少量元素的排序,它是乙個有效的演算法。其實現過程使用雙層迴圈,外層迴圈每次 插入乙個新的元素 內層迴圈將 新插入的數 與前面已排好序的部分進行比較,找到插空位置,形成新的有序數列。插入排序的平均時間複雜度是 o n 2 空間複雜度為常數階 o 1 具體時間複雜度和...