排序演算法 一 插入排序 直接插入排序 希爾排序

2021-08-14 21:07:05 字數 1690 閱讀 2760

當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排序碼與array[i-1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序後移。

// 最差時間複雜度 ---- 最壞情況為輸入序列是降序排列的,此時時間複雜度o(n^2)

// 最優時間複雜度 ---- 最好情況為輸入序列是公升序排列的,此時時間複雜度o(n)

// 平均時間複雜度 ---- o(n^2)

// 空間複雜度 ------ o(1)

// 穩定性 ------------ 穩定

void insertsort(int* array, int size)

array[j + 1] = key;}}

對於插入排序,如果比較操作的代價比交換操作大的話,可以採用二分查詢法來減少比較操作的次數,我們稱為二分插入排序

// 最差時間複雜度 ---- o(n^2)

// 最優時間複雜度 ---- o(nlogn)

// 平均時間複雜度 ---- o(n^2)

// 空間複雜度 ------ o(1)

// 穩定性 ------------ 穩定

void binaryinsertsort(int* arr, int

size)

else

}for (int j = i - 1; j >= left; j--)

arr[left] = key;}}

當n較大時,二分插入排序的比較次數比直接插入排序的最差情況好得多,但比直接插入排序的最好情況要差,所當以元素初始序列已經接近公升序時,直接插入排序比二分插入排序比較次數少。二分插入排序元素移動次數與直接插入排序相同,依賴於元素初始序列。

希爾排序也叫縮小增量排序,是插入排序的一種更高效的改進版本,是基於插入排序的以下兩點性質而提出改進方法的:

希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好的了(此時插入排序較快)。

假設有乙個很小的資料在乙個已按公升序排好序的陣列的末端。如果用複雜度為o(n^2)的排序(氣泡排序或直接插入排序),可能會進行n次的比較和交換才能將該資料移至正確位置。而希爾排序會用較大的步長移動資料,所以小資料只需進行少數比較和交換即可到正確位置。(如下面的圖)

// 最差時間複雜度 ---- 根據步長序列的不同而不同。已知最好的為o(n(logn)^2)

// 最優時間複雜度 ---- o(n)

// 平均時間複雜度 ---- 根據步長序列的不同而不同。

// 空間複雜度 ------ o(1)

// 穩定性 ------------ 不穩定

void shellsort(int* arr, int

size)

while (gap>0)

arr[j + gap] = key;

}gap = gap / 3;}}

排序演算法 插入排序 直接插入排序

package 插入排序 直接插入排序 從後向前找到合適位置後插入 穩定 基本思想 每步將乙個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置 從後向前找到合適位置後 直到全部插入排序完為止。public class 直接插入排序 system.out.println 排序之前 fo...

排序演算法 插入排序 直接插入排序

當插入第i i 1 個元素時,前面的v 0 v i 1 等i 1個 元素已經有序。這時,將第i個元素與前i 1個元素v i 1 v 0 依次比較,找到插入位置即將v i 插入,同時原來位置上的元素向後順移。在這裡,插入位置的查詢是順序查詢。直接插入排序是一種穩定的排序演算法,其實現如下 public...

插入排序 直接插入排序

直接插入排序演算法思想 將整個資料表分成左右兩個子表,其中左子表為有序表,右子表為無序表 整個排序過程就是將右子表中的元素逐個插入到左子表中,直到右子表為空,而左子表成為新的有序表。演算法過程分析 將待排序的元素存放在陣列r n 1 中,在初始狀態下,r 0 為監視哨,r 1 為有序區,r 2 r ...