帶問題思考以下幾點:
1、每個演算法的思想是什麼?
2、每個演算法的穩定性怎樣?時間複雜度是多少?
3、在什麼情況下,演算法出現最好情況 or 最壞情況?
4、每種演算法的具體實現又是怎樣的?
n每次選擇乙個元素k插入到之前已排好序的部分a[1…i]中,插入過程中k依次由後向前與a[1…i]中的元素進行比較。若發現發現a[x]>=k,則將k插入到a[x]的後面,插入前需要移動元素。
效率:時間複雜度:o(n^2).
穩定性:
如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。
其他的插入排序有二分插入排序,2-路插入排序。
在要排序的一組數中,選出最小(或者最大)的乙個數與第1個位置的數交換;然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後乙個數)比較為止。
在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。每次遍歷後確定乙個尾部的最大值。
1)比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3)針對所有的元素重複以上的步驟,除了最後乙個。
4)持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
1)選擇乙個基準元素,通常選擇第乙個元素或者最後乙個元素,
2)通過一趟排序講待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另一部分記錄的 元素值比基準值大。
3)此時基準元素在其排好序後的正確位置
4)然後分別對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。
(a)排序的全過程
(b)一趟排序的過程:
效率:快速排序是通常被認為在同數量級(o(nlog2n))的排序方法中平均效能最好的。但若初始序列按關鍵碼有序或基本有序時,快排序反而蛻化為氣泡排序。
穩定性:快速排序是乙個不穩定的排序方法
歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。因為1 個元素的表總是有序的。所以對n 個元素的待排序列,每個元素可看成1 個有序子表。對子錶兩兩合併生成n/2個子表,所得子表除最後乙個子表長度可能為1 外,其餘子表長度均為2。再進行兩兩合併,直到生成n 個元素按關鍵碼有序的表。
效率:歸併排序在o(n*logn)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序)也是效率比較高的。
缺點是,它需要o(n)的額外空間。但是很適合於多鍊錶排序。
穩定性:歸併排序最大的特色就是它是一種穩定的排序演算法。
桶排序:簡單來說,就是把資料分組,放在乙個個的桶中,然後對每個桶裡面的再進行排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)
。例如,要對大小為[1..1000]範圍內的n個整數a[1..n]排序 :
首先,可以把桶設為大小為10的範圍,具體而言,設集合b[1]儲存[1..10]的整數,集合b[2]儲存 (10..20]的整數,……集合b[i]儲存( (i-1)*10, i*10]的整數,i = 1,2,..100。總共有 100個桶。
然後,對a[1..n]從頭到尾掃瞄一遍,把每個a[i]放入對應的桶b[j]中。 再對這100個桶中每個桶裡的數字排序,這時可用冒泡,選擇,乃至快排,一般來說任 何排序法都可以。
最後,依次輸出每個桶裡面的數字,且每個桶中的數字從小到大輸出,這樣就得到所有數字排好序的乙個序列了。
基數排序:
堆的定義如下:具有n個元素的序列(k1,k2,...,kn),當且僅當滿足
時稱之為堆。由堆的定義可以看出,堆頂元素(即第乙個元素)必為最小項(小頂堆)。
若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於(或不小於)其子女的值,根結點(堆頂元素)的值是最小(或最大)的。
比如下面的待排序列:
278、109、063、930、589、184、505、269、008、083
我們將每個數值的個位,十位,百位分成三個關鍵字: 278 -> k1(個位)=8 ,k2(十位)=7 ,k3=(百位)=2。
然後從最低位個位開始(從最次關鍵字開始),對所有資料的k1關鍵字進行桶分配(因為,每個數字都是 0-9的,因此桶大小為10),再依次輸出桶中的資料得到下面的序列。
930、063、083、184、505、278、008、109、589、269
再對上面的序列接著進行針對k2的桶分配,輸出序列為:
505、008、109、930、063、269、278、083、184、589
最後針對k3的桶分配,輸出序列為:
008、063、083、109、184、269、278、505、589、930
實質就是分組插入排序,該方法又稱縮小增量排序(
遞減增量排序演算法),是插入排序的一種高速而穩定的改進版本。先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。
因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。
1)選擇乙個增量序列t1,t2,…,tk,其中ti>tj(其中i),tk=1;(比如
n為要排序數的個數,
增量序列d = )
2)按增量序列個數k,對序列進行k 趟排序;
3)每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。
來自為知筆記(wiz)
資料結構與演算法 排序演算法 快速排序
源 cpp view plain copy include void quicksort int int,int intfindposs int int,int intmain quicksort arry,0,6 printf after sorted n for i 0 i 7 i printf...
資料結構與演算法 排序
排序原理 1.比較相鄰的元素。如果前乙個元素比後乙個元素大,就交換這兩個元素的位置。2.對每一對相鄰元素做同樣的工作,從開始第一對元素到結尾的最後一對元素。最終最後位置的元素就是最大 值。氣泡排序的 實現 public static void sortpop int arr 測試 public st...
《資料結構與演算法 排序》
1 快速排序 1.記錄 排序中的結點 2.檔案 一系列結點構成的線性表 3.排序又稱分類 4.排序碼 結點中乙個或者多個字段,其值作為排序運算中的根據。基本思想 每次選擇待排序的記錄序列的第1個記錄,按照排序碼的大小將其插入到已排序的記錄序列的適當位置,直到所有記錄全部排序完畢。最簡單的排序方法。整...