穩定性:如果a原本在b前面,而a=b,排序之後a仍然在b的前面則為穩定,排序之後 a 可能會出現在 b 的後面即為不穩定。
不穩定的排序演算法:快速排序,希爾排序,選擇排序和堆排序。
時間複雜度如下:圖**於
插入排序是將每乙個元素都與前面的元素比較,小的放在前面。
**如下:
void
insert_sort
(vector<
int>
&num)
}
最好情況:原陣列是乙個有序陣列,時間複雜度o(n);
最好情況:原陣列是乙個逆序陣列,時間複雜度o(nn);
平均時間複雜度:o(nn);
從陣列中第乙個數開始,依次遍歷陣列中的每乙個數,通過相鄰比較交換,每一輪迴圈下來找出剩餘未排序數的中的最大數並「冒泡」至數列的頂端。
void
bubble_sort
(vector<
int>
&num)
}}
最好情況:原陣列是乙個有序陣列,時間複雜度o(n);
最好情況:原陣列是乙個逆序陣列,時間複雜度o(nn);
平均時間複雜度:o(nn);
從所有記錄中選出最小的乙個資料元素與第乙個位置的記錄交換;然後在剩下的記錄當中再找最小的與第二個位置的記錄交換,迴圈到只剩下最後乙個資料元素為止。
void
select_sort
(vector<
int>
&num)
}}
最好情況:原陣列是乙個有序陣列,時間複雜度o(nn);
最好情況:原陣列是乙個逆序陣列,時間複雜度o(nn);
平均時間複雜度:o(n*n);
希爾排序法是對相鄰指定距離(稱為增量)的元素進行比較,並不斷把增量縮小至1,完成排序。
希爾排序開始時增量較大,分組較多,每組的記錄數目較少,故在各組內採用直接插入排序較快,後來增量di逐漸縮小,分組數減少,各組的記錄數增多,但由於已經按di−1分組排序,檔案叫接近於有序狀態,所以新的一趟排序過程較快。因此希爾 排序在效率上比直接插入排序有較大的改進。
在直接插入排序的基礎上,將直接插入排序中的1全部改變成增量d即可,因為希爾排序最後一輪的增量d就為1。
平均時間複雜度:希爾排序演算法的時間複雜度分析比較複雜,實際所需的時間取決於各次排序時增量的個數和增量的取值。時間複雜度在o(n ^ 1.3)到o(n ^ 2)之間。
堆:1、完全二叉樹或者是近似完全二叉樹。
2、大頂堆:父節點不小於子節點鍵值,小頂堆:父節點不大於子節點鍵值。左右孩子沒有大小的順序。
堆排序在選擇排序的基礎上提出的,步驟:
1、建立堆
2、刪除堆頂元素,同時交換堆頂元素和最後乙個元素,再重新調整堆結構,直至全部刪除堆中元素。
快速排序是採用分治的思想,設定乙個鍵值,大於它的放在右邊,小於它的放在左邊,然後對左右兩個陣列進行遞迴,重複同樣的操作。
**如下:
void
quick_sort
(vector<
int>
&num,
int l,
int r)
num[first]
=key;
quick_sort
(num,l,first)
;quick_sort
(num,first+
1,r)
;}
快速排序的時間效能取決於快速排序遞迴的深度,可以用遞迴樹來描述遞迴演算法的執**況。
最壞情況:遞迴樹是一顆斜樹,最大深度為n,交換次數n-i,時間複雜度o(nn);
比如排序好的從大到小陣列,現在要從小到大排序。
最好情況:遞迴樹分布很均勻,深度為nlongn,交換次數n-i,
時間複雜度o(nlongn);
平均時間複雜度:o(n*longn);
就空間複雜度來說,主要是遞迴造成的棧空間的使用,最好情況,遞迴樹的深度為log2n,其空間複雜度也就為o(logn),最壞情況,需要進行n‐1遞迴呼叫,其空間複雜度為o(n),平均情況,空間複雜度也為o(logn)。
十大排序演算法
1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...
十大排序演算法
排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...
十大排序演算法
github 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序...