常見排序演算法總結

2021-07-23 08:52:19 字數 2253 閱讀 7184

1.氣泡排序—蠻力法

基本思想:兩兩比較相鄰記錄,如果反序側交換,直到沒有反序的記錄為止。如果是正序排,將待排序的元素看作是豎著排列的 「 氣泡 」 ,較小的元素比較輕,從而要往上浮。

時間複雜度:o(n*n);

**:

void bubblesort(int a,int n) //優化的氣泡排序 

}if(flag==0) break;}}

/*設定flag的目的是為了檢測每一趟排序是否有交換,假如沒有交換則已經排好,沒有必要繼續排序了*/

2.快速排序—蠻力法

基本思想:

(1)將整個記錄序列劃分為有序區跟無序區,初始時,有序區為空,無序區包含所有記錄。

(2)在無序區查詢最小值,將它與無序區的第乙個記錄交換,使有序區增加乙個數,同時無序區減少乙個數。

(3)不斷重複(1)跟(2),直到無序區只剩下乙個數為止。

時間複雜度:o(n*n);

**:

void selectionsort(int a,int n) //選擇排序

}}

3.直接插入排序—減治法

基本思想:

(1)將整個帶排序序列劃分成有序區和無序區,初始時有序區為待排序記錄序列中的第乙個記錄,無序區包括所有剩餘待排序的記錄;

(2)將無序區的第乙個記錄插入有序區的合適位置,從而使無序區減少乙個記錄,有序區增加乙個記錄;

(3)重複執行(1)和(2);

講述:

假設有一組無序序列 r0, r1, … , rn-1。

(1) 我們先將這個序列中下標為 0 的元素視為元素個數為 1 的有序序列。

(2) 然後,我們要依次把 r1, r2, … , rn-1 插入到這個有序序列中。所以,我們需要乙個外部迴圈,從下標 1 掃瞄到 n-1 。

(3) 接下來描述插入過程。假設這是要將 ri 插入到前面有序的序列中。由前面所述,我們可知,插入ri時,前 i-1 個數肯定已經是有序了。

所以我們需要將ri 和r0 ~ ri-1 進行比較,確定要插入的合適位置。這就需要乙個內部迴圈,我們一般是從後往前比較,即從下標 i-1 開始向 0 進行掃瞄。

時間複雜度:

平均情況

最壞情況

最好情況

n2n2n

演算法穩定性

直接插入排序的過程中,不需要改變相等數值元素的位置,所以它是穩定的演算法。

**

void insertsort(int

list,int n)

list[j+1]=temp;

}}

4.堆排序—減治法

在這裡不描述,有興趣的讀者請看後續的排序演算法補充

5**歸併排序**—分治法

將待排序序列r[0…n-1]看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n/2個長度為2的有序表;將這些有序序列再次歸併,得到n/4個長度為4的有序序列;如此反覆進行下去,最後得到乙個長度為n的有序序列。

綜上可知:

歸併排序其實要做兩件事:

(1)「分解」——將序列每次折半劃分。

(2)「合併」——將劃分後的序列段兩兩合併後排序。

我們先來考慮第二步,如何合併?

在每次合併過程中,都是對兩個有序的序列段進行合併,然後排序。

這兩個有序序列段分別為 r[low, mid] 和 r[mid+1, high]。

先將他們合併到乙個區域性的暫存陣列r2中,帶合併完成後再將r2複製回r中。

為了方便描述,我們稱 r[low, mid] 第一段,r[mid+1, high] 為第二段。

每次從兩個段中取出乙個記錄進行關鍵字的比較,將較小者放入r2中。最後將各段中餘下的部分直接複製到r2中。

經過這樣的過程,r2已經是乙個有序的序列,再將其複製回r中,一次合併排序就完成了。

**:

void merge(int array, int low, int mid, int high)  else 

}// 若第一段序列還沒掃瞄完,將其全部複製到合併序列

while (i <= mid)

// 若第二段序列還沒掃瞄完,將其全部複製到合併序列

while (j <= high)

// 將合併序列複製到原始序列中

for (k = 0, i = low; i <= high; i++, k++)

}

常見排序演算法總結

sort.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std const int len 100 class csort 注意此處應該有分號 csort csort length len 建構函式,初始化陣列 arr j 1 ...

常見排序演算法(總結)

演算法名 時間複雜度 空間複雜度 穩定性氣泡排序o n2 o 1 不穩定 選擇排序o n2 o 1 不穩定 插入排序o n2 o 1 穩定 歸併排序o nlog n o n 可以優化到o 1 穩定 快速排序o nlog n o logn n 不穩定 堆排序o n logn o 1 不穩定 希爾排序o...

常見排序演算法總結

我們在平時的開發中,排序演算法可以說是最常用的演算法之一,不同的排序演算法,有著不一樣的效能消耗,雖說前端開發對演算法的要求沒有那麼高,但是對於一些常見的演算法,我們還是要掌握的,它屬於乙個開發者的基本功,今天,我們就來總結一下常見的排序演算法,請看下面這張表 下面排序都以由小到大排序為目的 1 基...