排序/Sort
开个贴,写一些排序相关的东西
c
的qsort()
与c++
的st::sort()
:
实际上sort
比快排qsort
还要快,因为c++
对sort()
函数进行了优化,在C++11
标准中排序的复杂度在最坏情况下为 O(nlogn)
,二者差距一到二个数量级。
选择排序 Selection sort
找到最值,与第一个指针交换。
$\mathbf{time}:best:\omicron(n),worst:\omicron(n^2)$
$\mathbf{spcae}:\omicron(1)$
插入排序 Insertion sort
找到最值,移动数组,插入空隙。
$\mathbf{time}:best:\omicron(n),worst:\omicron(n^2)$
$\mathbf{spcae}:\omicron(1)$
希尔排序 Shell sort
让每间隔 $h$ 的小数组是有序的,那么整体就是有序的$(当 h \rightarrow 1)$
复杂度与 $h$ 有关。
$\mathbf{time}:best:\omicron(nlog n),worst:\omicron(n^2)$
$\mathbf{spcae}:\omicron(1)$
归并排序 Merge sort
1 | //需要tmp[]数组 |
适用分而治之的方法(两两排序、归并、再排序、再归并)(可用简单排序归并)
快排 Quick sort
1 | /*Lomuto,选自ACwing*/ |
将数据分区,(小于<->大于)/(小于<->等于<->大于),再分而治之。
分区方案有:Lomuto partition scheme & Hoare partition scheme:
Lomuto:
Hoare: