从各种来源引用我知道内置的C函数,stable_sort是稳定的,但qsort是不稳定的。如果是这样的话,我们为什么要使用qsort呢?这不是多余的吗?为什么不使用stable_sort呢?
稳定排序意味着相等元素的顺序保持不变。这并不总是必需的。
如果不需要,则算法更简单,有时更快和/或更节省内存。
一个稳定排序算法的典型例子是归并排序。
选择快速排序而不是稳定排序的主要原因是速度:qsort
通常比stable_sort
快,这不足为奇,因为stable_sort
有更强的保证。
O (N·日志<子> 2子> 子>
空间是另一个需要考虑的问题:qsort
是在适当的位置完成的,这意味着不需要额外的内存分配。另一方面,stable_sort
尝试临时分配大小等于被排序数组的大小。
这个函数尝试分配一个大小与待排序序列相等的临时缓冲区。如果分配失败,则选择效率较低的算法。
来自rcgldr的注释: (HP/Microsoft实现的std::stable_sort
使用了序列大小的1/2的临时缓冲区。后半部分排序到序列的后半部分中,前半部分排序到临时缓冲区中,然后临时缓冲区和序列的后半部分合并回序列中。
如果是这样的话,我们为什么要使用qsort呢?
stable_sort()
不是标准c的一部分,qsort()
是标准c的一部分。
C的qsort()
没有被指定为使用快速排序算法,也没有被要求是稳定的,也没有被要求是非稳定的。
qsort()
通常被使用,因为它是最便携的。由于qsort()
没有关于速度、内存效率和数据稳定性的规范,因此通常使用适用于目标平台的实用方法进行编码。在嵌入式平台上,内存空间通常比速度更重要。在台式机上,速度可能是最重要的。