1.氣泡排序
大一就學的必備技能,最簡單的排序時i,j都從0-n進行判斷swap,雖然也是o(n2)但這種排序低階到無法進入我們的十大排序中,所以要對其進行一下優化,就是i從0-n,但j可以從n-1到i,這樣節省了不必要的操作。
冒泡就是說每個數與後面的比較,這樣每次就會把未排序的最大的浮到後面。最壞(完全亂序,退化到剛才說的不入流方法)和平均時間複雜度為o(n2),最好就是o(n)(本來就有序,一趟完成),空間複雜度為o(1)。
void
bubble
(vector<
int>
& a)}}
}
2.選擇排序
就是每次從未排序陣列中選擇乙個最小的放在已排序的最右邊,思路很簡單,就是每次都得遍歷完全部陣列才能找到最小的。最好最壞平均時間複雜度均為o(n2),空間複雜度為o(1)。
選擇排序的元素的比較次數與初始序列無關,直接選擇排序的時間複雜度與初始序列無關的。
void
select
(vector<
int>
&a)swap
(a[i]
, a[index]);
}}
3.插入排序
顧名思義,就是將當前遍歷到的數插入到已排序陣列裡。它與選擇排序相比,不需要每趟走完陣列,只要找到合適的位置就可以結束該次迴圈了
時間複雜度為o(n2),最好o(n)。空間o(1).
直接插入排序
void
insert
(vector<
int>
& a)
}}
折半插入:就是在插入時採用二分法來定位該插到哪,節省比較次數。
void
bininsert
(vector<
int>
& a)
//統一移動元素,然後將這個元素插入到正確的位置
temp = a[i]
;for
(j = i; j > high +
1; j--
) a[high +1]
= temp;
}}
void
shellinsert
(vector<
int>
& a,
int d)
if(i != t - d)
a[i + d]
= tmp;}}
void
shellsort
(vector<
int>
& a)
}
5.計數排序
計數排序是一種線性排序演算法,不需要進行比較,時間複雜度為o(n)。(注意是計數排序不是基數排序,兩者不同)
基本思想是:對於每個元素x,找出比x小的數的個數,從而確定x在排好序的陣列中的位置。此演算法需要輔助陣列,是以空間換時間。
其實就是桶排序的優化,限制並計算好了額外空間的最佳大小。
void
countsort
(vector<
int>
&arr,
int maxval)
}
十大排序演算法速記總結
選取第乙個數為哨兵 將比哨兵小的數都交換到前面,比哨兵大的數都交換到後面 返回哨兵位置,根據哨兵位置劃分左右區間重複第二步,直到各區間只有乙個數。int partition vector nums,int left,int right 再找左邊,只要左邊的數 哨兵就繼續 while i j nums...
十大排序演算法
1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...
十大排序演算法
排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...