三、插入排序:
插入排序是一種非常簡單的排序,它的實現難度低於冒泡和選擇。(我第乙個for迴圈寫出的排序就是插入排序)插入排序類似整理撲克牌,將每一張牌插到其他已經有序的牌中適當的位置。
基本思想:
插入排序由n-1趟排序組成,對於p=1到n-1趟,插入排序保證從位置0到位置p上的元素為已排序狀態。
簡單的說,就是插入排序總共需要排序n-1趟,從index為1開始,講該位置上的元素與之前的元素比較,放入合適的位置,這樣迴圈下來之後,即為有序陣列。
**實現
1 void insertionsort(int *array, int len)
2 14 }
15 }
16 }
insertionsort
**的問題很明顯,就像選擇排序為什麼會比冒泡快一樣,我們可以減少交換次數來優化**。
但是不交換怎麼排序呢?用賦值語句進行覆蓋實現,
其核心的**如下:
for(j = i; j > 0 && temp < array[j-1]; j--)
array[j] = temp;
打個比方:
原陣列元素為 : 7 1 2 3
第一輪:
1 < 7;執行array[j] = array[j-1]
1 1 2 3;
再執行array[j] = temp;
1 7 2 3;
第二輪:
2 < 7;執行array[j] = array[j-1]
1 2 2 3
再執行array[j] = temp;
1 2 7 3
2 !< 1;退出迴圈
第三輪:
3 < 7;執行array[j] = array[j-1]
1 2 3 3
再執行array[j] = temp;
1 2 3 7
3 !< 2;退出迴圈;
**實現:
1 void insertionsort(int *array, int len)
2 14 array[j] = temp; //找到正確位置後立即插入
15 }
16 }
insertionsor
現在讓我來想一想乙個問題,乙個陣列其元素為 5 1 2 3 4 6 7 8,
根據插入排序的**可得到相應的過程
第一輪:1 5 2 3 4 6 7 8 一次比較,兩次賦值
第二輪:1 2 5 3 4 6 7 8 兩次比較,三次賦值
第三輪:1 2 3 5 4 6 7 8 三次比較,四次賦值
第四輪:1 2 3 4 5 6 7 8 四次比較,五次賦值
這個陣列的元素除了5原本都是有序的,但是,為了找到5正確的插入位置,總共進行了10次比較,14次賦值。
明眼人都看得出來5的正確位置應該是整個陣列的最中間的位置,可是計算機偏偏就是個「瞎子」,那我們該怎麼樣讓這個「瞎子」,知道這個元素是在陣列的最中間呢?
這就涉及到到上篇拓展的內容——運用二分查詢來這個元素的正確位置。
這裡先貼上二分的核心**(建議先看懂二分查詢再來看二分排序)
while (left <= right) //如果走到頭都沒有找到就退出
else
}
這裡是用迴圈來實現二分查詢,當然,我們也可以用遞迴來實現。這裡為了節省時間,我就不再多做解釋。
從所貼的**可看出通過二分查詢我們確定元素5的正確位置只需要1次比較和5次賦值,大大減少了比較次數和賦值次數。
當然對於二分排序來說採用折半查而減少,為o(nlogn),但是元素交換的次數仍為o(n2),二分排序演算法是穩定的。
下面我們來看一下完整的**:
1 void insertsort(int *arr, int n)
2 19 else
20
23 }
24 25 for (j = i-1; j > right; j--)
26
29 arr[right+1] = temp;
30 }
31 }
insertsort
大家可以自行嘗試寫一下遞迴版的二分排序,我在這裡就貼**了。
經典排序演算法學習筆記三 插入排序
工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序 即只需用到o 1 的額外空間的排序 因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。資料結構 陣列最差時間複雜度 o n 2...
插入排序演算法學習
插入排序就如同手裡放了一堆紙牌,把紙牌從左到右進行排序。insert sort a for j 2 to n n為陣列a的長度 do key a j insert a j into the sorted sequence a 1.j 1 i j 1 while i 0 and a i key do ...
演算法學習 插入排序
插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入 實現 public static void insertsort int array if array.length 0 r...