插入排序
步驟:
- 從第一個元素開始,該元素可以認為已經被排序
- 取出下一個元素,在已經排序的元素序列中從后向前掃描
- 如果該元素(已排序)大於新元素,將該元素移到下一位置
- 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
- 將新元素插入到該位置中
- 重復步驟2
穩定
空間復雜度O(1)
時間復雜度O(n2)
最差情況:反序,需要移動n*(n-1)/2個元素
最好情況:正序,不需要移動元素
在列表已被排序時,插入排序是線性算法O(n)。
在列表“近似排序”時,插入排序仍然是線性算法。
因而,插入排序不適合對於數據量比較大的排序應用。但是,如果需要排序的數據量很小,例如,量級小於千,那么插入排序還是一個不錯的選擇。
冒泡排序
步驟:(從后往前)
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
- 針對所有的元素重復以上的步驟,除了最后一個。
- 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
穩定
空間復雜度O(1)
時間復雜度O(n2)
空間復雜度O(1)
時間復雜度O(n2)
冒泡排序的最壞時間復雜度為O(n2)。 算法的平均時間復雜度為O(n2) 。冒泡排序最好的時間復雜度為O(n)。
快速排序
原理,通過一趟掃描將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,
然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列
不穩定,時間復雜度 最理想 O(nlogn) 最差時間O(n^2) 平均復雜度O(nlogn)
堆排序
這里的堆(二叉堆),指得不是堆棧的那個堆,而是一種數據結構。
堆可以視為一棵完全的二叉樹,完全二叉樹的一個“優秀”的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用數組來表示,每一個結點對應數組中的一個元素.
數組與堆之間的關系
什么是最大堆
堆中每個父節點的元素值都大於等於其孩子結點(如果存在),這樣的堆就是一個最大堆
因此,最大堆中的最大元素值出現在根結點(堆頂)
堆排序就是把堆頂的最大數取出,
將剩余的堆繼續調整為最大堆,具體過程在第二塊有介紹,以遞歸實現
不穩定,時間復雜度 最理想 O(nlogn) 最差時間O(nlogn) 平均復雜度O(nlogn)
時間復雜度和空間復雜度
時間復雜度是程序運行的時間,也可以說是次數;
空間復雜度是程序占用的空間;
精辟:
要在 hash 表中找到一個元素就是 O(1)
要在無序數組中找到一個元素就是 O(n)
訪問數組的第 n 個元素是 O(1)
訪問鏈表的第 n 個元素是 O(n)
要在無序數組中找到一個元素就是 O(n)
訪問數組的第 n 個元素是 O(1)
訪問鏈表的第 n 個元素是 O(n)
