八、排序
本文最后更新于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调整堆(将替换的堆顶元素与左右子树比较,直到调整到合适位置)

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇