排序演算法學習整理三(插入)

2021-10-19 05:17:24 字數 2393 閱讀 6896

三、插入排序:

插入排序是一種非常簡單的排序,它的實現難度低於冒泡和選擇。(我第乙個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...