排序算法可以分為內部排序和外部排序。內部排序是指在內存中對數據記錄進行排序,外部排序是指因為排序的數據非常大,壹次容納不下所有的排序記錄,排序時需要訪問外部存儲。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸並排序、快速排序、堆排序、基數排序等等。用壹張圖總結壹下:
點擊下圖查看大圖:
關於時間復雜度平方(O(n2))的簡單排序:直接插入、直接選擇和冒泡排序。
線性對數順序(O(nlog2n))排序、快速排序、堆排序和歸並排序;
O (n1+0)),它是介於0和1之間的常數。謝爾分類
線性順序(O(n))排序基數排序,此外還有桶和箱排序。
論穩定性
穩定排序算法:冒泡排序、插入排序、歸並排序和基數排序。
沒有穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序。
名詞解釋:
n:數據規模k:就地“桶”數:占用常量內存,不占用額外內存Out-place:占用額外內存穩定性:排序後兩個相等鍵值的順序與排序前相同,包括以下內容:
1、冒泡排序2、選擇排序3、插入排序4、希爾排序5、合並排序6、快速排序7、堆排序8、計數排序9、桶排序10和基數排序算法包括以下詳細信息:
冒泡排序算法
冒泡排序也是壹種簡單直觀的排序算法。它反復訪問要排序的系列,壹次比較兩個元素,如果它們的順序錯了,就交換它們。訪問系列的工作壹直重復,直到不需要交換為止,也就是說系列已經排序了。這種算法的名字來源於較小的元素會通過交換慢慢“浮”到序列的頂端。
選擇性排序算法
選擇性排序是壹種簡單直觀的排序算法。不管什麽數據進去都是O(n?)的時間復雜度。所以在使用的時候,數據量越小越好。唯壹的好處可能就是不占用額外的內存空間。
插入排序算法
雖然插入排序的代碼實現沒有冒泡排序和選擇排序那麽簡單粗暴,但是它的原理應該是最容易理解的,因為玩過撲克的人應該都能秒懂。插入排序是最簡單、最直觀的排序算法。它的工作原理是在排序後的序列中從後向前掃描未排序的數據,找到對應的位置並插入。
希爾排序算法
Hill排序,也稱為遞減增量排序算法,是插入排序的壹個更高效的改進版本。但是Hill排序是壹種不穩定的排序算法。
合並排序算法
歸並排序是壹種基於歸並操作的有效排序算法。這個算法是分而治之的壹個非常典型的應用。
快速排序算法
快速排序是由Tony Hall開發的壹種排序算法。平均起來,對n個項目進行排序需要進行ο (NLOGN)次比較。在最壞的情況下,需要進行ο (N2)比較,但這種情況並不常見。事實上,快速排序通常比其他ο (NLOGN)算法快得多,因為它的內循環可以在大多數架構上高效實現。
堆排序算法
Heapsort是指利用堆的數據結構設計的壹種排序算法。Heap是壹種近似完整的二叉樹結構,同時滿足heap的性質:即子節點的鍵值或索引總是小於(或大於)其父節點。堆排序可以說是壹種利用堆概念的選擇性排序。
計數排序算法
計數排序的核心是將輸入的數據值轉換成鍵,存儲在額外的數組空間中。作為壹種線性時間復雜度的排序,計數排序要求輸入數據必須是壹定範圍內的整數。
桶排序算法
桶排序是計數排序的升級版本。它利用函數的映射關系,效率的關鍵在於這個映射函數的確定。
基數排序算法
基數排序是壹種非比較整數排序算法。它的原理是把整數按照位數切割成不同的數,然後按照每個位數分別進行比較。因為整數也可以用特定的格式表示字符串(如姓名或日期)和浮點數,所以基數排序不僅僅適用於整數。