插入排序是一種簡單直觀且穩定的排序演算法。它的工作方式非常像人們排序一手撲克牌一樣,開始時,我們的左手為空並且桌子上的牌面朝下。然後,我們每次從桌子上拿走一張牌並將它插入左手正確的位置,為了找到一張牌的正確位置,我們從右到左將它與已在手中的每張牌進行比較。
需求:排序前:
排序後:
排序原理:
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 具體時間複雜度和...