内置qsort函数和稳定排序函数有什么区别?
What is the difference between inbuilt qsort function and stable sort function?
从引用的各种来源我知道内置的 C 函数 stable_sort 是稳定的,但 qsort 是不稳定的。如果是这样,我们为什么还要使用 qsort?不是多余的吗?为什么不使用 stable_sort 呢?
稳定排序意味着相等元素的顺序得以保留。这并不总是必需的。
如果不需要,算法更简单,有时更快and/or更节省内存。
稳定排序算法的典型例子是merge sort.
选择快速排序而不是稳定排序的原因主要是速度:qsort
通常比 stable_sort
快,这不足为奇,因为 stable_sort
具有更强的保证。
O(N·log2(N)). If additional memory is available, then the complexity is O(N·log(N)).
Space 是另一个考虑因素:qsort
是就地完成的,这意味着不需要额外的内存分配。另一方面,stable_sort
尝试临时分配大小等于正在排序的数组。
This function attempts to allocate a temporary buffer equal in size to the sequence to be sorted. If the allocation fails, the less efficient algorithm is chosen.
来自 rcgldr 的注释:(std::stable_sort
的 HP/Microsoft 实现使用了序列大小的 1/2 的临时缓冲区.后半部分排序到序列的后半部分,前半部分进入临时缓冲区,然后临时缓冲区和序列的后半部分合并回序列
If that is the case why do we use qsort at all?
stable_sort()
不是标准 C 的一部分。qsort()
是标准 C 的一部分。
C的qsort()
未指定使用快速排序算法,既不要求稳定也不要求不稳定。
qsort()
经常被使用,因为它是最便携的。由于 qsort()
没有关于速度、内存效率和数据稳定性的规范,因此通常使用针对目标平台的实用方法进行编码。在嵌入式平台上,内存 space 通常比速度更重要。在台式机上,速度可能是最重要的。
从引用的各种来源我知道内置的 C 函数 stable_sort 是稳定的,但 qsort 是不稳定的。如果是这样,我们为什么还要使用 qsort?不是多余的吗?为什么不使用 stable_sort 呢?
稳定排序意味着相等元素的顺序得以保留。这并不总是必需的。
如果不需要,算法更简单,有时更快and/or更节省内存。
稳定排序算法的典型例子是merge sort.
选择快速排序而不是稳定排序的原因主要是速度:qsort
通常比 stable_sort
快,这不足为奇,因为 stable_sort
具有更强的保证。
O(N·log2(N)). If additional memory is available, then the complexity is O(N·log(N)).
Space 是另一个考虑因素:qsort
是就地完成的,这意味着不需要额外的内存分配。另一方面,stable_sort
尝试临时分配大小等于正在排序的数组。
This function attempts to allocate a temporary buffer equal in size to the sequence to be sorted. If the allocation fails, the less efficient algorithm is chosen.
来自 rcgldr 的注释:(std::stable_sort
的 HP/Microsoft 实现使用了序列大小的 1/2 的临时缓冲区.后半部分排序到序列的后半部分,前半部分进入临时缓冲区,然后临时缓冲区和序列的后半部分合并回序列
If that is the case why do we use qsort at all?
stable_sort()
不是标准 C 的一部分。qsort()
是标准 C 的一部分。
C的qsort()
未指定使用快速排序算法,既不要求稳定也不要求不稳定。
qsort()
经常被使用,因为它是最便携的。由于 qsort()
没有关于速度、内存效率和数据稳定性的规范,因此通常使用针对目标平台的实用方法进行编码。在嵌入式平台上,内存 space 通常比速度更重要。在台式机上,速度可能是最重要的。