排序演算法總結 1 插入排序

2021-06-09 04:26:50 字數 1815 閱讀 4652

主要分為插入排序、交換排序、選擇排序、歸併排序、計數(也有叫分配)排序。

一、插入排序。

插入排序,就是每次將乙個待排序的物件,插入到乙個有序的資料序列中,得到乙個新容量加1的資料有序序列。如此往復。可分為直接插入排序、二分法插入排序、希爾排序。不同插入方法的區別就是尋找插入位置的方法不同。

1)直接插入排序。

資料物件在順序表中儲存,當插入第 i 個物件 v[i] 的時候,前面的 i-1個元素v[0]、v[1]、v[2]....v[i-1]已經排好序了,用 i-1個物件的關鍵碼同已經存在的 i -1個物件的關鍵碼從後往前比較,找到合適的位置就將v[i]插入,插入點以後的位置都隨其向後移動一位。

直接插入排序的過程可以進一步理解為乙個長度為

i的陣列被分為兩個集合,即已排序集合和未排序集合。開始時已排序集合為空,而未排序集合即為整個陣列。插入乙個物件,已排序集合元素數目加1,相應地未排序集合的元素數目減1,重複插入過程直至將未排序集合清空為止。這時已排序集合就是最終結果。

源**如下:

void insertsort(int *a, int len)

}

或者優化的乙個版本:

void insertsort(int *a, int len)

a[j] = temp;//插入

}}

直接插入排序的時間複雜度是o(n2),n的平方的複雜度,是一種穩定的排序演算法。

2) 二分法插入排序

二分插入排序又叫折半插入排序,它同直接插入排序一樣,已經排好序的順序表中。用折半發找到需要插入元素的插入的位置,然後插入。

源**如下:

void binaryinsertsort(int *a, int len)

while (j> mid+1)

a[mid+1] = temp;

}}

二分插入排序是一種穩定的排序方法,時間複雜度要低於直接插入排序

3) 希爾排序

希爾排序又稱為縮小增量排序。該演算法先取乙個小於資料表中元素個數n的整數gap,並以此作為第乙個間隔,將資料表分為gap個子序列,所有距離為gap的物件

存放在同乙個子串行中。這樣,也就把資料表中的全部元素分成了gap個組。而所有距離為gap的倍數的記錄會被放在同乙個組中。

分組確定後,在每乙個小組中分別進行直接插入排序。區域性排序完成後就縮小間隔gap,並重複上述步驟,直至取到gap=1時,完成最後一次直接插入排序。

gap的取法,shell在設計演算法時提出來的取法是

顯然開始時間隔gap較大,因而各組中的資料量相對較小,至少在最開始的時候演算法是非常快的。隨著演算法的進行,間隔gap的取值變得越來越小,因此子串行中

元素個數也就越來越多,所以排序工作可能會變慢。但是由於前面已經完成了部分排序工作,因而在很大程度上減輕了後期的工作量,致使最終總體的排序速度

還是比較快的口這就是所謂「縮小增量排序」方法的設計原理所在。

源**如下:

void shellsort(int *a, int len)

a[j] = temp;

} gap = gap / 2;

}}

內部排序演算法總結

排序演算法(1) 插入排序

輸入 n個數的乙個序列 a1,a2 an 輸出 輸入序列的乙個排序 a1,a2,an 滿足a1 a2 an。首先,對於少量元素的排序,插入排序是一種有效的演算法。舉個生動的例子,插入排序就像我們手裡剛剛分到的撲克牌,亂序。我們會將排由左到右進行整理,由小到大排序。待排序列 5 4 3 9 7 5 3...

排序演算法1 插入排序

插入排序思想 每一步將乙個待排序的元素,按期排序碼的大小,插入到前面已經排好序的一組元素的合適位置上去,知道元素插完。插入排序分為直接插入排序,和優化後的二分插入排序,我們先看第一種 基本思想 當我們插入第i i 1 個元素時,前面的所有元素已經排好序,此時我們使用當前元素從後向前比較,直到找到乙個...

排序演算法 1 插入排序

插入排序的過程和平時打牌的時候給手裡的牌排序差不多 從牌桌上抽一張牌 把抽到的牌從右到左 或者從左到右 挨個和手裡的牌進行比較,當發現左邊的牌大一些,右邊的牌小一些,就將牌插入到該位置 重複執行步驟1,直到牌抽完了 include include 對範圍 first,last 的元素進行插入排序 p...