直接插入排序(Insert Sort)

2022-07-11 04:21:08 字數 1132 閱讀 6433

穩定排序、原地排序、比較排序

直接插入排序是一種非常直觀的排序演算法,它的基本思想是將線性表分為已排序的前半部分和待排序的後半部分,從待排序部分選出第乙個元素,插入到已排序部分的對應位置中,直到全部記錄都插入到已排序部分中。通常來講,我們不會真正的首先判斷插入位置,再進行移動,而是邊移動,邊判斷是否已經移動到對應的位置。

一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:

直接插入排序每次插入的時間複雜度為$o(n)$,一共執行$n - 1$次,因此總體時間複雜度是$o(n^2)$。在插入排序插入位置的過程可以使用折半查詢演算法將查詢位置的複雜度優化到$o(\log n)$,但因為還需要$o(n)$的時間複雜度在順序表上執行操作,所以總體時間複雜度依然是$o(n^2)$。

最好情況:當待排序記錄已經有序,這時需要比較的次數是$c_ = n − 1 = o(n)$。

最壞情況:如果待排序記錄為逆序,則最多的比較次數為$c_ = \sum_^ (i) = n (n−1)=o(n^2)。

平均情況:$o(n^2)$

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

void insert_sort_v1(int *arr, int l, intr) 

}return;

}

找到序列最小值,提前移至最左端,可減少乙個監督項(監督項的代價為$o(n^2)$,查詢並移換最小值的代價為$o(n)$)。

void insert_sort_v2(int *arr, int l, intr) 

//為什麼逐次交換,而不是直接和最左端交換?

for (int i = min; i > l; i--)

for (int i = l + 2; i <= r; i++)

}return;

}

排序演算法(3) 直接插入排序InsertSort

介紹 插入排序的工作原理是,對於每個未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。越有序越快 步驟 1.從第乙個元素開始,該元素可以認為已經被排序 2.取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 3.如果被掃瞄的元素 已排序 大於新元素,將該元素後移一位 4.重複步驟3,直到找...

直接插入排序

直接插入排序是一種最簡單的排序方法,它的基本思想是依次將每個記錄插入到乙個有序中去。就是說,第i i 1 遍整理時,a1,a2,ai 1已經是排好序的子串行 取出第i個元素ai,在已排好序的子串行為ai找到乙個合適的位置,並將它插到該位置上。易知上述排序當i 1時實際上為空操作,故可直接從i 2開始...

直接插入排序

直接插入排序的演算法思想 直接插入排序 straight insertion sort 的基本操作是將乙個記錄插入到已經排好序的有序表中,從而得到乙個新的 記錄數增 1 的有序表。根據該思想,編寫 如下 從已有序列的第0個記錄開始比較 public static void insertsort1 i...