深度剖析std::sort

一、简介

std::sort是C++ STL的一个排序算法,它可以按照一定规则对一个给定的数组、向量或迭代器范围内的元素进行排序。std::sort是非稳定排序算法,平均时间复杂度为O(nlogn),最坏情况下时间复杂度为O(n^2),空间复杂度为O(logn)。

二、语法

template
void sort( RandomIt first, RandomIt last );
template
void sort( RandomIt first, RandomIt last, Compare comp );

sort接受两个迭代器参数,第一个迭代器first表示要排序的范围中的第一个元素,last表示最后一个元素的下一个位置。sort可以通过比较器comp自定义排序规则。

三、排序规则

std::sort默认按照小于号运算符(operator<)进行比较,也就是说,排序后的元素是按照从小到大的顺序排列的。如果想要对元素按照从大到小的顺序排序,可以自定义比较器:

bool cmp(int a, int b) {
    return a > b;
}
std::sort(a.begin(), a.end(), cmp);

上面的代码定义了一个比较器cmp,将a中的元素按照从大到小的顺序进行排序。

四、分区策略

std::sort采用的是快速排序(quicksort)的分区策略。简单来说,快速排序的过程就是先选出一个元素作为基准(pivot),将比pivot小的元素放在左边,比pivot大的元素放在右边,然后递归排序左右两个子序列。

std::sort是一种不稳定排序算法,排序后相等的元素在数组中的相对位置可能会发生变化。这是因为std::sort的分区策略采用的是最后一个元素作为基准,而不是中间的元素或者随机选择的元素。如果存在相等的元素,std::sort在分区时很可能会导致相等的元素被分配到不同的子序列中。

五、优化

1. 优化比较器

std::sort在每一次比较时都要调用比较器函数,因此比较器函数的效率对排序的性能有很大影响。可以采用lambda函数或者函数对象的方式对比较器进行优化:

std::sort(a.begin(), a.end(), [](int a, int b) {
    return a > b;
});

上面的代码使用lambda函数定义了一个比较器,实现了对a的降序排序。

2. 优化部分排序

如果只需要对序列中的一部分进行排序,可以使用partial_sort函数,比直接使用sort要快一些:

std::partial_sort(a.begin(), a.begin() + k, a.end());

上面的代码对a中前k个元素进行排序,后面的元素不保证有序。此时,partial_sort的时间复杂度为O(nlogk),比sort快了一些。

六、示例

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> a = {3, 1, 2, 5, 4};
    std::sort(a.begin(), a.end());
    for (auto it : a) {
        std::cout << it << " ";
    }
    std::cout << std::endl;

    std::sort(a.begin(), a.end(), [](int a, int b) {
        return a > b;
    });
    for (auto it : a) {
        std::cout << it << " ";
    }
    std::cout << std::endl;

    std::partial_sort(a.begin(), a.begin() + 3, a.end());
    for (auto it : a) {
        std::cout << it << " ";
    }
    std::cout << std::endl;

    return 0;
}

原创文章,作者:LZZMC,如若转载,请注明出处:https://www.506064.com/n/331812.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
LZZMCLZZMC
上一篇 2025-01-20 14:10
下一篇 2025-01-20 14:10

相关推荐

  • 深度查询宴会的文化起源

    深度查询宴会,是指通过对一种文化或主题的深度挖掘和探究,为参与者提供一次全方位的、深度体验式的文化品尝和交流活动。本文将从多个方面探讨深度查询宴会的文化起源。 一、宴会文化的起源 …

    编程 2025-04-29
  • Python下载深度解析

    Python作为一种强大的编程语言,在各种应用场景中都得到了广泛的应用。Python的安装和下载是使用Python的第一步,对这个过程的深入了解和掌握能够为使用Python提供更加…

    编程 2025-04-28
  • Python递归深度用法介绍

    Python中的递归函数是一个函数调用自身的过程。在进行递归调用时,程序需要为每个函数调用开辟一定的内存空间,这就是递归深度的概念。本文将从多个方面对Python递归深度进行详细阐…

    编程 2025-04-27
  • Spring Boot本地类和Jar包类加载顺序深度剖析

    本文将从多个方面对Spring Boot本地类和Jar包类加载顺序做详细的阐述,并给出相应的代码示例。 一、类加载机制概述 在介绍Spring Boot本地类和Jar包类加载顺序之…

    编程 2025-04-27
  • 深度解析Unity InjectFix

    Unity InjectFix是一个非常强大的工具,可以用于在Unity中修复各种类型的程序中的问题。 一、安装和使用Unity InjectFix 您可以通过Unity Asse…

    编程 2025-04-27
  • 深度剖析:cmd pip不是内部或外部命令

    一、问题背景 使用Python开发时,我们经常需要使用pip安装第三方库来实现项目需求。然而,在执行pip install命令时,有时会遇到“pip不是内部或外部命令”的错误提示,…

    编程 2025-04-25
  • 动手学深度学习 PyTorch

    一、基本介绍 深度学习是对人工神经网络的发展与应用。在人工神经网络中,神经元通过接受输入来生成输出。深度学习通常使用很多层神经元来构建模型,这样可以处理更加复杂的问题。PyTorc…

    编程 2025-04-25
  • 深度解析Ant Design中Table组件的使用

    一、Antd表格兼容 Antd是一个基于React的UI框架,Table组件是其重要的组成部分之一。该组件可在各种浏览器和设备上进行良好的兼容。同时,它还提供了多个版本的Antd框…

    编程 2025-04-25
  • 深度解析MySQL查看当前时间的用法

    MySQL是目前最流行的关系型数据库管理系统之一,其提供了多种方法用于查看当前时间。在本篇文章中,我们将从多个方面来介绍MySQL查看当前时间的用法。 一、当前时间的获取方法 My…

    编程 2025-04-24
  • sort()的应用及实现原理

    一、sort()基本介绍 sort()方法是在JavaScript中对数组进行排序的一种常用方法,它可以按照一定的规则将数组中的元素按照升序或降序排列。sort()方法有两种应用方…

    编程 2025-04-24

发表回复

登录后才能评论