直接插入排序和希爾排序

2021-07-31 21:50:38 字數 1916 閱讀 8779

一:插入排序

在一組無序的陣列中,假設第乙個有序,每一次陣列中剩餘的元素與第乙個比較,然後逐個插入到乙個有序的序列中,直到這個陣列所有的數字有序為止;

二:直接插入演算法

演算法思路:

1:我們先假設第乙個有序的數字下標為end,

2:下乙個要插入的數字(tmp)繼續構成有序就直接插入,此時end向後挪一位,

3:繼續插入元素,如果下乙個插入的數字和第乙個不成構成有序,先與前乙個元素交換,然後把end的下標–,直到所有的元素都有序結束。

實現

template

struct less

};template

struct greater

};template

void insertsort(t * _a, size_t n)

else

end -= 1;

}_a[end + 1] = tmp;

}}template

void printsort(t*a, size_t n)

cout

<< endl;

}void testselect()

; int n = sizeof (a) / sizeof(a[0]);

insertsort>(a, n);

printsort(a, n);

}

分析:直接插入排序最壞的時間複雜度o(n^2),也就是將乙個有序的陣列逆序,最好的時間複雜度o(n),就是有序;那麼如何讓插入演算法更加高效呢?

三:希爾排序

希爾排序又稱縮小增量排序,我們可以看成是直接插入排序的改進版本;

,當數字的基數很大時,而且都接近無序,如果用插入演算法乙個個比較後再插入,時間很高,我們可以借助分制的思想,我乙個大的無序陣列,分成若干個小串行列,再進行插入排序這樣就會很快;

演算法思路:

1:首先進行預排序,將大的元素盡快到後面,小的元素盡快到前面

2:然後取間距gap

template

struct less

};template

struct greater

};template

void printsort(t*a, size_t n)

cout

<< endl;

}template

void shellsort(t*_a, size_t n)

else

end -= gap;

}_a[end + gap] = tmp;}}

}void testshellsort()

; int n = sizeof(a) / sizeof(a[0]);

shellsort>(a, n);

printsort(a, n);

}

四:總結:1:直接插入排序:

適合乙個有序的序列。而且範圍不是很大,快速高效,時間複雜度最快o(n)

缺陷:

當序列的範圍很大時,或者逆序時時間複雜度o(n^2)

2:希爾排序:

解決序列的範圍很大時的排序;

分制思想:將大的序列,根據距離分成若干個小的序列;

每個小的序列進行插入排序,當距離為1時,進行直接插入排序。

直接插入排序和希爾排序

if defined insertsort h define insertsort h include define maxsize 100 typedef int keytype 關鍵字型別用來比較 typedef char infotype 其他型別的資訊 typedef structrecty...

直接插入排序和希爾排序

一 直接插入排序 插入排序 1.1 基本思想和原理 將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即 先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。要點 設立哨兵,它有兩個作用 進入查詢 插入位置 迴圈之前,它儲存了r i ...

直接插入排序 和 希爾排序

直接插入排序的思想 include include using namespace std 直接插入排序 9,1,5,8,3,7,4,6,2 void insertsort int arr,int sz else break arr end key void printf int arr,int s...