插入排序之直接插入排序和Shell排序

2021-07-10 09:36:36 字數 1356 閱讀 9076

基本思想是將第乙個資料元素看成有序序列,從第二個元素開始逐個插入這個有序的子串行中。

如:{35,2,7,9,34,57}這樣的序列

{2,35,7,9,34,57}

{2,7,35,9,34,57}

{2,7,9,35,34,57}

{2,7,9,34,35,57}

{2,7,9,34,35,57 }

假設有序子串行中只有乙個資料元素{2},將35插入這個有序子串行中,成為{2,35};然後將7插入這個有序子串行中,則為{2,7,35};以此類推,完成有序排列。

**實現如下:

template

void straightinsertsort(elemtype elem, int n)

//對陣列elem完成直接插入排序

{ for(int i = 1; i < n; i++)

//選擇陣列中插入的元素

elem[j+1] = e;}}

在最好的情況下,陣列元素遞增有序排列,這時每個內層for迴圈剛進入就退出,只比較一次,總的比較次數為n-1。可知這時的時間複雜度是o(n)。

在最壞的情況下,陣列元素遞減有序排列,這時每個元素都必須移動到陣列較前位置。這時第一次迴圈移動1次,第二次迴圈移動2次……最後一次迴圈移動n - 1次。總的移動次數為n*(n-1)/2。時間複雜度為o(n^2)。

當我們遇到如這樣的陣列時{20,30,10,44,7},我們使用直接插入排序移動最後乙個元素時,需要從最後一步一步移動至最前方。總移動次數較大,因此我們可以按照一定規則將最後乙個元素互換之前方,最後使用直接插入排序則大大降低了移動次數,這也是shell排序的初衷,優化的直接插入排序演算法。

希爾排序的基本思想是將整個待排元素序列分割成若干個子串行,分別對各子串行進行直接插入排序,等整個序列的資料元素基本有序後,對整個序列進行一次直接插入排序。

**如下:

template

void shellinsert(elemtype elem, int n, int incr)

//對陣列elem做增量為incr的shell排序

elem[j+incr] = e;

}}void shellsort(elemtype elem, int n,int inc,int t)

//按照增量序列inc[0 ,...,t-1]對陣列做shell排序

}

因為shell排序的時間複雜度是增量序列的函式,難以計算。在大量實踐的基礎上推出當n在某個範圍內,時間複雜度可以達到o(n^1.3)。

插入排序之直接插入排序

插入排序概述 有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法 插入排序法,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為...

插入排序之直接插入排序

依次將每個記錄 無序表 插入到乙個已排好序的有序表中,得到乙個新的,記錄增加1的有序表 向撲克牌中插入新牌,圖書館整理圖書 有n個數,將第乙個數看做乙個有序表,從第二個開始從後向前比較,第一趟比較前兩個數,然後把第二個數按大小插入到有序表中 第二趟把第三個資料與前兩個數從後向前掃瞄,把第三個數按大小...

插入排序之直接插入排序

packagesort.algorithm publicclassdirectinsertsort inttemp,j for int i 1 i data.length i data j 1 temp 輸出排序好的資料 for int k 0 k data.length k 直接插入排序,一般對於...