插入排序及其優化

2021-08-28 18:33:06 字數 3465 閱讀 8307

複雜度o(n**2),用筆模擬過程可輕鬆得出

一、思路

index 0 1 2 3 4 5

value 4 3 2 6 4 8

1、選定起始指標index=0,此時已排好順序的子陣列長度為1(就是list[0]==4)

2、指標後移,候選元素變為list[1]==3,將該元素不斷向左交換到某個位置,使得list[0]與list[1]組成的子陣列有序

3、指標繼續後移,直到抵達陣列尾,向左不斷交換位置到合適位置後,排序結束

二、實現

推薦insert_sort1的實現;第二種使用for in 語句在某些情況下具有天生缺陷(無字尾++/–操作)

from sort_helper import test_sort,random_array

def insert_sort1(array):

for i in range(len(array)):

#當前位置i代表可以向左交換位置的次數

下面兩段**意義相同,先實現,再精簡!!

#**1表明:僅有exp2成立時,迴圈才可以繼續,所以可以把exp2直接提到while判斷語句

while exp1:

if exp2:

pass

else:

break

#**2

while exp1 and exp2:

pass

三、插入排序與選擇排序對比:均為o(n**2)的排序演算法
from selectionsort1 import selectionsort1

可以看出:插入排序居然比選擇排序慢,要知道選擇排序的第二輪迴圈遍歷了一次,插入排序第二輪迴圈有提前終止的情況

**因為:插入排序第二輪迴圈實現方式略差,最壞情況下要switch i次,而選擇排序找到該輪最小值時僅switch1次;每switch1次涉及3次賦值,耗時較大

3.1 插入排序演算法改進1

申請乙個臨時變數,儲存當前候選元素,

#改進版插入排序

def insert_sort3(array):

for i in range(len(array)):

#當前位置i代表可以向左交換位置的次數

可以看出改進後效能提公升明顯(但還是比選擇排序慢,python問題?)

3.2 插入排序對於近乎有序的陣列

def nearly_ordered_array(n,switch_num):

myarr = list(range(n))

for _ in range(switch_num):

a = randint(0, n-1)

b = randint(0, n-1)

myarr[a],myarr[b] = myarr[b],myarr[a]

return myarr

from selectionsort1 import selectionsort1

from insert_sort import insert_sort2,insert_sort3

from sort_helper import test_sort,random_array,nearly_ordered_array

if __name__ == '__main__':

array = nearly_ordered_array(10000, 10)

array1 = array[:]

array2 = array[:]

test_sort('selectionsort', selectionsort1, array)

test_sort('insertsort', insert_sort2, array1)

test_sort('advanced insertsort', insert_sort3, array2)

這種情況下,改進後的選擇排序演算法效能優勢異常明顯

1、selectionsort和insertsort時間複雜度均為o(n**2)

2、選擇排序效能較為穩定

3、對於有序性較強的陣列,選擇排序效能優勢明顯;對於完全有序的陣列,選擇排序退化為o(n),但選擇排序仍為o(n**2)

4、重複元素越多也間接表現為有序性強;越短表現為有序性越強,所以插入排序會被當做子過程優化其他排序演算法。

插入排序及其優化

插入排序 把乙個無序的陣列分為兩部分,一部分為有序 剛開始只有乙個元素 一部分為無序 從第二個元素開始 將無序元素乙個乙個插入到有序元素中。void insertsort int arr,size t size arr j x 直接插入排序耗時的操作有 比較 後移賦值。時間複雜度如下 1 最好情況 ...

插入排序及其優化

插入排序 直接插入排序 時間複雜度為o n 2 穩定的排序元素移動是順序的 在乙個陣列中,將第乙個元素看作排序元素序列裡的唯一元素,然後用臨時變數tmp首先存放第二元素,即可在陣列中空第二個元素位置 即此位置可被覆蓋 將第二個元素與有序序列裡面唯一乙個元素進行比較,根據排序條件決定元素是否需要向後移...

插入排序優化

插入排序的是十分常見的o n 2 級別的排序演算法,其排序思路如下 一次迴圈使前n個數都為有序,巢狀的二次迴圈將第n個數插入到前n個數中合適的位置,我的實現 如下 public void insertsort int a,int n else 這個插入排序相對於選擇排序有可以提前結束一層迴圈的特點,...