本文最后更新于392 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、时间性能
时间复杂度为O(nlog2n)的算法有:快速排序、堆排序、归并排序;其中以快速排序最好;
时间复杂度为O(n2)的算法有:直接插入排序、冒泡排序、简单选择排序;其中以直接插入为最好;
时间复杂度为O(n)的算法有:基数排序
二、空间性能
所有的简单排序算法:(直接插入、冒泡、简单选择)和堆排序;空间复杂度为O(1);
快速排序:O(logn),为栈所需要的辅助空间
归并排序的空间复杂度为O(n);
链式基数排序需附设队列首尾指针,空间复杂度为O(rd);
三、排序方法的稳定性能
快速排序与堆排序是不稳定的排序方法;
四、快速排序详解:
void QuickSort(vector& vecData, int nLow, int nHight)
{
if (nLow >= nHight)
{
return;
}
// 1. 设置两个探测针
int nLpos = nLow;
int nRpos = nHight;
int nProvit = vecData.at(nLow); // 2. 将首选元素设为基准值
// 移动两侧探测针,直到它们相遇
while ( nLpos < nRpos )
{
// 设定的是左边的基准值,所以先从右边开始
// 3. 移动右侧探针,直到遇到第一个比基准值小的数停止
while (nLpos < nRpos && vecData.at(nRpos) >= nProvit)
{
nRpos--;
}
// 4. 移动左侧探针,直到遇到第一个比基准值大的数停止
while (nLpos < nRpos && vecData.at(nLpos) <= nProvit)
{
nLpos++;
}
// 5. 如果两探针没有相遇,交换两探针的值
if (nLpos < nRpos)
{
swap(vecData.at(nLpos), vecData.at(nRpos));
}
}
// 6. 两探测相遇,将基准值与相遇点的值交换
swap(vecData.at(nLow), vecData.at(nRpos));
// 此时基准值在中间,根据这个基准值将原来的数据分为了两半,左边比基准值小,右边比基准值大
// 7. 将左右两组数据递归
QuickSort(vecData, nLow, nLpos - 1);
QuickSort(vecData, nLpos + 1, nHight);
}可详见:https://blog.csdn.net/weixin_42437295/article/details/90771962
五、堆排序详解
5.1建堆(大根堆、小根堆)
5.2输出堆顶元素并将待排序末尾元素替换堆顶
5.3调整堆(将替换的堆顶元素与左右子树比较,直到调整到合适位置)