1. 冒泡排序:
思路:進行相鄰比較後,每一輪將最值移動到一端;

平均時間複雜度:需要進行n-1輪,內層有n/2次的可能交換,合計是O(n²);

最壞時間複雜度:需要進行n-1輪,內層每次有n-1-i(i是當前輪)的交換次數,合計是O(n²);

最優情況:是一個原本就有序的數組,O(n);

空間複雜度:原地交換,O(1);

穩定排序;

2. 雞尾酒排序(雙向冒泡排序):

思路:以冒泡排序的思路,從左端冒到右端,再從右端冒到左端,對兩端有序更好;

平均時間複雜度:n個元素就要比較n-1輪,每次平均要比較n/2個元素,合計是O(n²);

最壞時間複雜度:比較n-1輪,每次需要比較n-1-i次(i是當前輪),合計是O(n²);
最優情況:同冒泡排序最優情況,一個原本就有序的數組,O(n);

空間複雜度:原地交換,O(1);

穩定排序;

3. 快速排序
思路:選出一個基準數,然後根據基準數將當前的數組分為大於組和小於組;

平均時間複雜度:分的輪次約為O(logn),每輪平均要比較(n-i)/2(i是當前輪),合計是O(nlogn);

最壞時間複雜度:每次都只挑選到邊緣的位置,無法將一個數組根據基準數分成兩份,所以遞歸的高度會變成n輪,合計為O(n²);
空間複雜度:這裏的空間複雜度為函數的引用佔用,它直接與棧的深度相關,即平均為O(logn),最壞是O(n);

不穩定排序;

4. 堆排序
思路:先進行建堆,之後進行堆內調整以達到有序,分為最大堆和最小堆;
建堆:採用Floyd建堆法,只遍歷大約一半的節點,每個節點的操作成本不同,約合計為O(n);

時間複雜度:無最好和最壞的差別,需要提取n次,每次複雜度為O(logn),合計為O(nlogn);
空間複雜度:在原堆中操作,為O(1);
不穩定排序;

5. 計數排序
前提:鍵值是整數,且範圍有限;
流程:1. 統計每個數的出現頻次,時間複雜度為O(n);2. 計算每個鍵的起始輸出位置(累計位置),複雜度為O(k);3. 再遍歷一遍排序好的數組,時間複雜度為O(n);

時間複雜度:合計為O(n + k);
空間複雜度:用於存放的值的空間大小,合計為O(k);

當k與n的數量級差不多時,會讓排序更快;
累計位置的方式可以穩定排序;

6. 桶排序
前提:需要被排序的值均勻地被分配在區間內;

流程:1. 建立b個桶,時間複雜度為O(b),掃描所有的元素並分配到桶內時間複雜度為O(n);2. 分別對桶的內部進行排序;3. 按桶的順序輸出桶內的每個元素;
期望時間複雜度:假設要被排序的數組均勻分佈,桶數b與n同階,即在同一個數量級:

        桶內的排序若用的是時間複雜度為O(n²)的排序算法,那麼合計的時間複雜度為b*O((n/b)²) = O(n²/b), 在此假設b約等於n,那麼最後的結果為O(n);

        桶內的排序若用的是時間複雜度為O(nlogn)的排序算法,那麼合計的時間複雜度為b*O((n/b)log(n/b)) = O(n²/b), 在此假設b約等於n,那麼最後的結果為O(n);

最壞的時間複雜度:所有的元素都堆在一個桶內,合計為O(n²);

是否穩定取決於桶內的排序算法是否是穩定的