1、直接插入排序
一、原理
直接插入排序它的整個數組分爲兩個區間,即無序區間和有序區間
,每次選擇無序區間的第一個元素,在有序區間選擇合適位置插入。話很少說,下面來看它的代碼實現:
2.代碼實現
再來分析一下這個排序的性能,最壞時間複雜度o(N),最好時間複雜度o(N^2),那麼平均複雜度爲o(N^2)。它的空間複雜度爲o(1),它是不須要開闢額外的空間的。能夠看出,這個排序不會顛倒相同數字得相對位置,咱們在排序時選擇的是大於等於就放在該數字的右邊。因此它是穩定排序。若是一組數基本有序,那麼選擇插入排序算法效率會更高。
2、希爾排序
1.原理
希爾排序是創建在插入排序的基礎上的,它把整個數組分紅gap組,而後對每一個組進行排序,排好以後再合成一個數組,繼續分紅gap/2組,重複上述步驟,直到gap=1;而後對整個數組進行插排,獲得最終有序數組。
2.代碼實現
下面來分析這個排序的性能,它是在插入排序基礎上進行了優化,因此它的時間複雜度要比插入排序小,最壞時間複雜度爲o(N^2),最好爲o(N),平均複雜度爲o(N^1.3),空間複雜度爲o(1),不屬於穩定排序,由於在分組過程當中沒法保證相同數的相對位置。
3、選擇排序
1.原理
每次從無序區間中選出最大的一個元素,存放在無序區間的最後,直到所有待排序的數據所有排完。
2.代碼實現
下面分析排序性能,最壞時間複雜度o(N^2),最好時間複雜度o(N),平均時間複雜度o(N^2),空間複雜度o(1),屬於不穩定排序。
4、堆排序
1.原理
堆排序也是創建在選擇排序的基礎上,只不過它是經過建大堆來選擇最大的元素,把堆頂元素和堆的最後一個元素交換,再把它放入另一個數組,而後對堆進行向下調整。
2.代碼實現算法
下面來看算法性能,時間複雜度爲o(N*logN),空間複雜度爲o(1),堆排序依然屬於不穩定排序。
5、冒泡排序
1.原理
冒泡排序也把數組分紅兩個區間,無序區間[0,array.length-i-1],有序區間[array.length-i-1,array.length],每次按順序從無序區間取出一個數,把它和後面的數一一進行比較,大數排後面,直到遍歷完全部數。冒泡次數爲array.length,須要比較的次數爲array.length-i-1。
2.代碼實現
下面來看算法性能,最壞時間複雜度爲o(N^2),最好時間複雜度爲o(N),平均時間複雜度爲o(N^2),空間複雜度爲o(1)。冒泡排序爲穩定排序。由於在比較過程當中,都是把大於它的數放在後面。數組
6、快速排序
1.原理
從待排序區間選擇一個值,做爲基準值,遍歷整個待排序區間,將比基準值小的值放在它的左邊,比它的值放在右邊,左右兩個小區間按照一樣的方法處理,直到小區間的長度=1,或者長度爲0,表示已經所有排好序。
2.代碼實現
它的最壞時間複雜度爲0(N^2),最好時間複雜度o(NlogN),平均時間複雜度o(NlogN),空間複雜度o(NlogN)。不穩定,能夠看出它比前幾個排序效率高了不少。
7、歸併排序
1.原理
採用分治法,將已有序的子序列合併,先使每一個子序列有序,再使每段序列有序,最後合併成一個有序數組。
2.代碼實現
該排序算法的時間複雜度爲o(NlogN),空間複雜度爲o(N),穩定排序。數據結構