演算法鋪子之排序 插入排序

2021-08-04 05:46:53 字數 2567 閱讀 4456

插入排序和選擇排序同樣是一種較為常見且容易實現的o(n^2)級別的排序演算法,但插入排序的效率和待排序資料的有序程度有關係,待排序資料的有序程度越高,插入排序的效率也就越高,甚至有時候能比o(nlogn)級別的排序演算法的效率還要高。所以插入排序也通常會成為其他排序演算法的子過程。

插入排序的思路和我們打撲克牌時,整理撲克牌的思路是一樣的,就是說將整個待排序資料序列看成兩個部分,乙個部分是有序序列,另乙個部分是無序序列。開始時,整個序列的第乙個元素所代表的部分為有序序列(因為只有乙個元素,怎麼滴也是有序的啊。。。),後面的元素的集合代表無序序列。進行插入排序時,會先將無序序列的第1個元素插入到有序序列中合適的位置,此時無序序列的起始位置從整個待排序序列的第3個元素開始,有序序列的結束位置變成了第2個元素。然後再一次進行插入排序,此時無序序列的起始位置從整個待排序序列的第4個元素開始,有序序列的結束位置變成了第3個元素,以此類推。

舉個栗子:假設現在有乙個陣列,我們要將這些資料按從小到大的公升序進行排序,陣列中的元素為。那麼插入排序的排序過程如下所示,{}表示有序部分,表示無序部分:

[6  1  2  4  7  3  5]

-->

1 2 4 7 3 5] 第1趟

1 2 4 7 3 5] -->

[2 4 7 3 5] 第2趟

[2 4 7 3 5]

-->

[4 7 3 5] 第3趟

[4 7 3 5]

-->

[7 3 5] 第4趟

[7 3 5]

-->

[3 5] 第5趟

[3 5]

-->

[5] 第6趟

[5]-->

第7趟

template

vector

insertsort(vector

data)

}return data;

}

從上面的**可知如果待排序資料的有序程度比較高的話,那麼插入的這個步驟能夠提前結束,這和上一遍中提到的選擇排序不同,選擇排序無論如何都是要對整個序列進行遍歷,找出最值。那麼港道理如果有序程度較高,插入排序應該比選擇排序要快,這裡我做了一下實驗。實驗中對size為10000的資料隨機進行3000次交換,這個資料中有部分資料是有序的。結果發現插入排序比選擇排序還要慢一點點,實驗截圖如下:

之所以比選擇排序還要慢,這是因為,雖然上面的插入排序的實現**中,雖然在部分有序的情況下能夠提前break,減少swap的次數,但比起選擇排序來說,swap的次數還是太多(選擇排序每趟只需要swap一次)。那麼如果能夠減少插入排序的swap的次數的話,將能提高插入排序的效能。

在第2節中實現的插入排序演算法是沒碰到乙個比自己大的數就和這個數進行交換。那麼我們可以先將無序部分的第1個元素進行備份,然後和有序部分的元素進行比較,如果碰到比自己大的,就將進行比較的元素往後挪,直到碰到比自己小的,這時候停下來將這個位置的資料賦值為備份的資料。

舉個栗子:假設現在有乙個陣列,我們要將這些資料按從小到大的公升序進行排序,陣列中的元素為,[1,2,4,7,3,5]。那麼插入排序的排序過程如下所示,{}表示有序部分,表示無序部分。此時要將1插入到合適的位置,過程如下:

先用乙個輔助空間拷貝a[3],即x=a[3]

6781247

35 資料(設陣列名為a)

0123456

78 下標^|

x = 1

然後x和a[2]比,x比a[2]小,那麼a[3]=a[2]得

6788247

35 資料(設陣列名為a)

0123456

78 下標

然後x和a[1]比,x比a[1]小,那麼a[2]=a[1]得

6778247

35 資料(設陣列名為a)

0123456

78 下標

然後x和a[0]比,x比a[0]小,那麼a[1]=a[0]得

6678247

35 資料(設陣列名為a)

0123456

78 下標

此時遍歷到邊界(到下標邊界,或者碰到比自己還小的數時),將x的值賦值給當前位置,即a[0]=x得

1678247

35 資料(設陣列名為a)

0123456

78 下標

**實現如下:

template

vector

insertsort2(vector

data)

data[j] = x;

}return data;

}

同樣,為了驗證優化效果,使用來第3節中同樣規模的資料來進行實驗驗證,實驗結果如下:

從實驗截圖可以出,去掉交換操作後的插入排序演算法比原始的插入排序演算法快了將近1倍。

插入排序作為和選擇排序時間複雜度同樣為o(n^2)的排序演算法,在待排序序列有序程度較高的情況下,能夠得到較高排序效率。

排序演算法之插入排序

排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...

排序演算法之插入排序

排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...

排序演算法之插入排序

本節主要分析插入排序演算法的直接插入排序和希爾 shell 排序 又稱縮小增量排序 1.直接插入排序 該排序是最簡單的排序方法,其基本思想是 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直至i n為止,依次將r i 插入當前的有序區r 1....