直接插入排序與折半插入排序分析

2022-08-28 09:42:11 字數 1651 閱讀 5691

一.直接插入排序原理

1.插入排序演算法首先要把排序的陣列分成兩部分:第一部分是這個陣列中所有已排序元素,而第二部分就是未排序的元素(即待插入元素)。

2.將待插入元素和已排序的元素逐一比較,若待插入的元素大,則直接將該元素算入已排序的元素中,否則交換兩元素的位置,並且待插入元素繼續和前乙個元素進行比較,直到不需要交換元素位置後,將該元素算入已排序的元素中。

3.重複執行步驟2,直到未排序的元素個數為0。

插入排序的基本思想是:每步將乙個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。

插入排序是乙個穩定的排序演算法。

二.直接插入排序時間複雜度

最壞情況下,陣列完全逆序,插入第2個元素時要考察前1個元素,插入第3個元素時,要考慮前2個元素,……,插入第n個元素,要考慮前 n - 1個元素。因此,最壞情況下的比較次數是1 + 2 + 3 + ... + (n-1),求和為 n2/2 - n / 2,忽略係數,取最高指數項,所以最壞情況下的複雜度為o(n2)。

最好情況下,陣列已經是有序的,每插入乙個元素,只需要考查前乙個元素,因此最好情況下的時間複雜度為o(n)。

三.直接插入排序**實現

public

static

void

main(string args) ;

sort(arr);

system.out.println(arrays.tostring(arr));

}public

static

void sort(int

arr)

else

}arr[j+1] =insert;}}

}

測試:執行後輸出結果如下

四.折半插入排序原理

折半插入排序是對直接插入排序的改進。它不去乙個個遍歷已經排序的元素,而是將插入元素直接和已經排好序的陣列的中間元素進行比較,如果插入的元素比較大,那麼插入的元素肯定屬於後半部分,否則屬於前半部分。這樣,不斷遍歷縮小範圍,很快就能確定需要插入的位置。

五.折半插入排序時間複雜度

在不是很理想的情況下,折半插入排序演算法比直接插入排序演算法明顯減少了關鍵字之間比較的次數,因此速度比直接插入排序演算法快,但記錄移動的次數沒有變,所以折半插入排序演算法的時間複雜度仍然為o(n2)。

折半插入排序演算法是一種穩定的排序演算法。

六.折半插入排序**實現

public

static

void

main(string args) ;

sort(arr);

system.out.println(arrays.tostring(arr));

}public

static

void sort(int

arr) else

//迴圈結束時,end}

//從begin到i,集體後移

for (int j = i; j > begin; j--)

//插入i

arr[begin] =temp;}}

測試:執行後控制台輸出

直接插入排序與折半插入排序

首先看一下例子,將資料乙個個的插入到乙個列表中,插入後這個列表就排序好了 注意 這個列表是遞增的,而且記憶體空間已分配好,只是沒有填充真正的資料,如下 int insertsort mergetype l,int data for j l len 1 j 0 j else return 0 測試用例...

直接插入排序和折半插入排序

1.直接插入排序 1.1插入排序 insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.1.2 基本過程 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直到i ...

插入排序之直接插入排序和折半插入排序

插入排序的基本思想是 將記錄分為有序和無序兩個序列。從無序序列中任取乙個記錄,然後根據該記錄的關鍵字大小在有序序列中查詢乙個合適的位置,使得該記錄放入這個位置後,這個有序序列仍然有序。每插入乙個記錄就稱為一趟插入排序,經過多趟插入排序,使得無序序列中的記錄全部插入到有序序列中,則排序完成。直接插入排...