按照排序的資料量的大小,一般將排序方法分為內排序和外排序。
內排序是指待排序的資料元素都存放在記憶體中,而外排序則指待排序的資料量太大,不能同時存放在記憶體中,整個排序過程需要在內外存之間多次交換才能進行。
常用的內排序演算法有:插入排序、選擇排序、交換排序、歸併排序和基數排序等。而外排序演算法則有多路平衡歸併排序和最佳歸併樹。
1.插入排序
基本思路:從初識有序的子集合開始,不斷地把新的元素插入到有序的子集合中合適的位置,使有序子集合中資料元素的個數不斷增加,直到有序子集合的大小等於待排序的資料元素集合的大小為止。
常見的插入排序方法有:直接插入排序和希爾排序。
直接插入排序
基本思路:順序地把待排序的資料元素按其關鍵字值的大小插入到已排列有序的子集合的適當位置,子集合的資料元素的個數逐漸增大,直至有序子集合的大小等於待排序元素集合的大小為止。
構造乙個初識的有序子集合。方法:將第乙個元素看成是初識有序子集合,然後從第二個元素開始,依次將其插入到有序子集合中去。
演算法描述如下:
void insertsort(elemtype a, int n)
{ //採用直接插入排序法對a[0]~a[n-1]
int i,j;
elemtype temp;
for(i=1;i-1&&temp.key時間複雜度:o(n^2),空間複雜度:o(1)只使用乙個臨時工作單位temp
希爾排序
基本思想:先把待排序的元素序列分成若干個小組,對同一組內的元素分別進行直接插入排序,然後,小組內元素個數逐漸增加,小組的個資料逐漸減少,當完成了所有資料元素都在同乙個組內的排序後排序過程結束。
如何分割待排序的元素:「跳躍分割」,將相距某個「增量」的元素分在同乙個小組內,確保全域性基本有序而不是區域性有序。
如何確定「增量」:一般的原則是,開始是增量取值較大,使得每個小組內的元素個數較少,這樣提供了元素跳躍移動的可能性,效率較高;後來增量逐步減少,每個小組中的元素個數逐步增加,但基本有序。希爾最早提出的方法是di=math.floor([n/2]),d(i-1)=math.floor([di/2]),且為質數,並且最後乙個增量必須等於1。
演算法描述如下:
void shellsort(elemtype a, int d, int num)
{//採用希爾排序法對a[0]~a[n-1]排序,d[0] ~ d[num-1]為增量序列。
int i,j,k,m,span;
elemtype temp;
for(m=0;m-1&&temp.key希爾排序演算法的空間複雜度為o(1),時間複雜度在o(nlog2n)和o(n^ 2)之間,最好的情況達o(n^ 1.3)。
排序演算法總結之插入排序
一,插入排序介紹 插入排序是基於比較的排序。所謂的基於比較,就是通過比較陣列中的元素,看誰大誰小,根據結果來調整元素的位置。因此,對於這類排序,就有兩種基本的操作 比較操作 交換操作 其中,對於交換操作,可以優化成移動操作,即不直接進行兩個元素的交換,還是用乙個樞軸元素 tmp 將當前元素先儲存起來...
排序演算法總結 插入排序
插入排序,顧名思義就是將乙個元素插入到適當的位置。其演算法核心是 1.將第乙個元素看做是個單獨的序列。顯然,只有乙個元素的序列肯定是有序序列。2.然後將和第二個元素做比較。如果第二個元素小,那麼就將第二個元素插入到第乙個元素前面,這樣我們就得到了乙個擁有兩個元素的有序序列。3.依次掃瞄剩餘元素,每掃...
排序演算法之插入排序
排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...