經典排序演算法學習筆記三 插入排序

2022-02-09 13:52:01 字數 2271 閱讀 2872

工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。

插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

資料結構

陣列最差時間複雜度

o(n^2)

最優時間複雜度

o(n)

平均時間複雜度

o(n^2)

最差空間複雜度

總共o(n) ,需要輔助空間o(1)

插入排序都採用in-place在陣列上實現。

從第乙個元素開始,該元素可以認為已經被排序

取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

如果該元素(已排序)大於新元素,將該元素移到下一位置

重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

將新元素插入到該位置後

重複步驟2~5

mark first element as

sorted

foreach unsorted element '

extract

'the element

for i = lastsortedindex to 0

if currentsortedelement >extractedelement

move sorted element to the right by

1else: insert extracted element

void insertion_sort(int arr, int

len)

}

template//

整數或浮點數皆可使用,若要使用物件(class)時必須設定大於(>)的運運算元功能

void insertion_sort(t arr, int

len)

}

(1)時間複雜度

初始狀態( n項)

正序反序

無序(平均)

第i趟比較次數1i

/總比較次數

n-1n(n-1)/2

/第i趟移動次數0i

/總移動次數

0n(n-1)/2

/時間複雜度

o(n)

o(n^2)

o(n^2)

(2)空間複雜度

在排序過程中僅需要乙個元素的輔助空間,所以空間複雜度為為o(1)。

(1)折半插入排序:因為使用插入排序得到的前半部分為已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查詢的方法來加快尋找插入點的速度。

(2)具體操作

1、將待插入區域的首元素設定為a[low],末元素設定為a[high],則比較時將待插入元素與a[m],其中m=(low+high)/2相比較

2、

do

while(low>high)

3、將此位置之後所有元素後移一位,並將新元素插入a[high+1]。

(3)c實現

#include typedef 

intelemtype ;

elemtype arr=;

elemtype n=10

,i,j;

elemtype low,high,mid;

void

binsort(elemtype r,elemtype n)

for(j=i-1;j>=low;j--)

r[low]=r[0

];} }

void

put(elemtype r,elemtype n)

void

main()

(4)複雜度分析

時間複雜度:o(n^2) //折半查詢只是減少了比較次數,但是元素的移動次數不變,所以折半插入排序演算法的時間複雜度仍然為o(n^2)

空間複雜度:o(1)

演算法學習筆記 排序 插入排序

插入排序是最簡單的一種排序方法,對於少量的資料排序是十分有效的。插入排序十分容易理解,平時玩撲克時,在理牌的過程中就是使用了插入排序的思想。可以通過這張來直觀的了解 下面是一張插入排序的動態圖。下面使用c語言來實現這一演算法 include void insertionsort int int in...

插入排序演算法學習

插入排序就如同手裡放了一堆紙牌,把紙牌從左到右進行排序。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...