1.直接插入排序:想象成給一個已經有序的數組中插入數據,所以只要從後往前找,找到比它小的數字
插入到它的後邊即可。先取第一個數字,一個數字肯定有序,再取第二個數字,從它的前一個開始找,
找到比它小的數字,插入到它的後面即可,如果不小於它則把該數字直接插入到當前的位置
時間複雜度:O(n^2)越有序越快 空間O(1) 穩定性:根據自己的實現。
2.希爾排序:利用直接插入排序的思想,先將數組分成奇數分,互素,例如5 3 1 。最後一個一定要是1.
時間複雜度:O(n*log(n))越有序越快 空間O(1) 穩定性:不穩定
3.冒泡: 兩兩相比,把最大的 往後交換。 時間複雜度O(N^2) 空間複雜度O(1) 穩定
4.選擇排序:定義一個Min(保存一趟找到的最小值),Min_index找到最小值的下標.如果最小值的下標和當前不相等,就
交換最小值和當前的值。
不穩定
5.快速排序: 取一個基準,一般取第一個,定義一個low hight。只要low<hight ,從後往前找,找到第一個比基準
小的數字,賦值給low的小標,再從前向後找,找到第一個比基準大的數字,賦值給hight下標的值。
遞歸空間複雜度log2(n) 不穩定
6.歸併排序: 先讓每個數字爲一組,組內都有序,再兩個兩個爲一組,再4個4個爲一組。最終讓數組完全有序。
一次歸併(先保證有兩個歸併段,再保證兩個歸併段都還有數據,low1 low2小的一方賦值給新的數組)
當兩個歸併段有一個沒有數據時,將另一個歸併段還存在數據的值賦值給新的數組。接下來是剩下的
不夠一個歸併段的數據直接賦值給新的數組即可
空間O(n) 穩定
7.堆排序: 1.一次堆調整:保存起始的數值。從它的左孩子開始,找到它的左右孩子中的較大值,如果較大值
大於當前保存的值,將較大值賦值給當前的值。start走到當前空出來的位置,也就是它的左右孩子中
的較大值的位置,如果小於,直接跳出,將tmp保存的值,直接賦值給當前的start的位置。
第一次建大根堆:從第一個葉子節點的父節點開始,到結尾,i--,循環
接下來,每次把頭一個和最後一個交換,把最後一個位置已經固定的數據剔除。
不穩定
排序算法-理論
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.