每天一演算法 (插入排序)

2022-04-09 06:39:55 字數 1482 閱讀 6878

一、原理

插入排序就是把當前待排序的元素插入到乙個已經排好序的列表裡面。對於給定的一組記錄,初始時假定第乙個記錄自成乙個有序序列,其餘記錄為無序序列。接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直到最後乙個記錄插到有序序列中為止。

二、思路

1.在要排序的一組數中,假設前面(n-1)[n>=2] 個數已經是排好順序的,現在要把第n個數找到相應位置並插入,使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。

2.例子:假設有乙個陣列 :

第一趟:1和3比較,1<3,則將1和3的位置互換,為:

1,3,2,8,7,9

第二趟:2和1、3比較,2<3,則將2和3的位置互換,為:

1,2,3,8,7,9

第三趟:8和1、2、3比較,8>前面的,則位置不變,為:

1,2,3,8,7,9

第四趟:7和1、2、3、8比較,7<8,則7和8的位置互換,為:

1,2,3,7,8,9

第五趟:9和1、2、3、7、8比較,9>前面的,則位置不變,為:

1,2,3,7,8,9

三、時間複雜度

在第一趟排序中,插入排序最多比較一次,第二趟最多比較兩次,依次類推,最後一趟最多比較n-1次,因此有:

1+2+3+...+n-1 = n*n(n-1)/2.

然而,因為在每一趟排序發現插入點之前,平均只有全體資料項的一半真的進行了比較,除以2得到:

n*n(n-1)/4.

複製的次數大致等於比較的次數。然而,一次複製與一次比較的時間耗費不同,所以相對隨機資料,這個演算法比氣泡排序快一倍,比選擇排序略快。

在任意情況,對於隨機順序的資料進行排序的時間複雜度為o(n2);對於已經有序或基本有序的資料來說,插入排序要好得多。當資料有序的時候,while迴圈的條件總是假。所以他就變成了外層迴圈中的乙個簡單語句,執行n-1次,在這種情況下,演算法執行只需要o(n)的時間。如果基本有序,插入排序只需要o(n)的時間。但是,對於逆序排列的資料,每次比較和移動都會執行,所以插入排序不必氣泡排序快。

四、**實現

1

/**2

* 排序演算法3*

@author

administrator4*/

5public

class

sort

23 arr[j + 1] = insert; //

找到了插入的位置,插入24}

2526

for(int i = 0;i < arr.length; i ++)29}

3031

/**32

* 測試

33*

@param

args

34*/

35public

static

void

main(string args) ;

37insertsort(arr);38}

39 }

每天一演算法 (氣泡排序)

一 原理 比較兩個相鄰的元素,將值大的元素交換至右端。二 思路 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟 首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全...

每天一演算法 (選擇排序)

一 原理 在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換 然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止 二 思路 1.假設有乙個陣列為 n個數 第一趟先選出 最小的元素 min k 將min k 位置 和 第乙個元素的位置 互換,此時第乙個元...

每天一演算法 (排序演算法總結)

一 集中排序演算法的比較 1.一般情況下幾乎不太使用氣泡排序,它過於簡單了,以至於可以毫不費力的寫出來。然而當資料量很小的時候,它會有些應用的價值。2.選擇排序雖然把交換次數降到了最低,但比較的次數仍然很大,當資料量小的時候,並且交換資料相對於比較資料更加耗時的情況下,可以應用選擇排序。3.單大多數...