首页 > 编程语言 >经典排序算法回顾:

经典排序算法回顾:

时间:2024-03-14 17:44:38浏览次数:26  
标签:回顾 复杂度 元素 主元 快排 算法 排序

排序算法有非常多,应用也非常多,在各种笔试面试中也常常出现,所以现在就来复习一下相关的排序算法吧!
下面会介绍多种排序算法,在此之前先说一下,排序算法的评价主要有以下几个方面:

排序算法的时间复杂度;
排序算法的空间复杂度;
排序算法的稳定性
其中前两个是老生常谈了,基本提到算法都会考虑这两点。第三点中排序算法的稳定性是指如果待排序列中存在相同元素时,经过排序之后相同元素的先后顺序是否被打乱,如果保持不变则说明这个排序算法是稳定的,否则称该排序算法是不稳定的。


1.快速排序(quickSort)
快速排序是最常见的排序算法之一,需要重点掌握,要能够手撕代码的程度。
快速排序其实用了分而治之 的策略,它的一个核心思想就是:选择一个枢纽(pivot),通过元素交换使得比pivot小的元素在它左边,比它大的元素在它右边,再分别对左右两边做相同的操作。

 

快速排序的执行时间与数据序列的初始排列和基准值选取有关,
最好的情况下 每次选择的主元都能够正中的划分序列,此时的时间复杂度是T(N)=O(N*logN),
在最坏的情况下 ,每次选择的主元都是极值的话,时间复杂度会达到T(N)=O(N^2)。(这个可以想象,如果每次主元都是最大值的话,那么划分相当于无意义,每次都要将剩余的所有元素进行排序,这样起不到快速排序的效果)

快排的实现过程中有两个重要的步骤:

选主元(pivot)
选主元为何重要,根据前面提到的快排的时间复杂度就可以知道,选取主元会非常大程度影响快排的效率。
一般情况下,最经典的选取主元方式就是任意头/中/尾的其中一个,这是最方便的做法。但是如果遇到本身已经有序的极端情况,选择头或尾作为主元就会非常危险。
那么也可以选择取头/中/尾的中位数作为主元(mid_of_3)。
或者可以随机选择一个未排序序列中的数作为主元,这也是有效的降低取到极值概率的办法。

 

标签:回顾,复杂度,元素,主元,快排,算法,排序
From: https://www.cnblogs.com/chenxiaomeng/p/18073564

相关文章

  • 14_学习日志_数据结构_冒泡排序_快速排序_插入排序
    #include<编织有意义的谎言,使我相信闭上眼再睁开眼时的世界是同一个>1.介绍    从后往前或者从前往后开始两两比较元素,使得最小数上浮或者最大数下沉为冒泡排序,快速排序利用分治思想,使得基准数左边都存放相对较小数,右边存放较大数,两边再按照同样的做法重复。插入排序......
  • 文心一言 VS 讯飞星火 VS chatgpt (214)-- 算法导论16.2 1题
    一、证明:分数背包问题具有贪心选择性质。如果要写代码,请用go语言。文心一言:要证明分数背包问题具有贪心选择性质,我们可以按照以下步骤进行逻辑推导:理解问题:分数背包问题允许我们选择物品的部分重量,目标是最大化背包内物品的总价值,同时不超过背包的总容量。贪心策略:我......
  • 2024最新华为OD机试,题库清单(按算法分类),高效刷题,举一反三,玩转OD
    目录专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢?一、逻辑分析二、数据结构1、线性表①数组②双指针2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈三、算法1、基础算法①贪心算法②二分查找③分治递归④搜索算法⑤排序算法2、......
  • Python实现BOA蝴蝶优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景蝴蝶优化算法(butterflyoptimizationalgorithm,BOA)是Arora等人于2019年提出的一种元启发式智能算法。该算法受到了蝴蝶觅食和交配行为的启发,......
  • Python实现BOA蝴蝶优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景蝴蝶优化算法(butterflyoptimizationalgorithm,BOA)是Arora等人于2019年提出的一种元启发式智能算法。该算法受到了蝴蝶觅食和交配行为的启发,......
  • 马拉车算法
    LuoguP3805【模板】manacher算法1//LuoguP3805【模板】manacher算法2#include<iostream>3#include<cstring>4#include<algorithm>5usingnamespacestd;67constintN=3e7;8chara[N],s[N];9intd[N];//回文半径函数1011voidget_......
  • PBKDF2算法:保障密码安全的利器
    PBKDF2算法起源:PBKDF2(Password-BasedKeyDerivationFunction2)算法是一种基于密码的密钥派生函数,最初由RSA实验室的密码学家提出,用于从密码中生成密钥。PBKDF2算法的设计目的是增加破解密码的难度,提高密码的安全性。PBKDF2在线加密|一个覆盖广泛主题工具的高效在线平台(......
  • Java(计算机相关)面试之海量数据问题处理(1)分治/hash/排序
    原文链接:https://blog.csdn.net/a619602087/article/details/130348569面试的时候经常被问到海量数据处理问题,下面我会分期介绍几种海量数据处理的思路还有案例了解了之后面试不用怕了大数据处理思路:分而治之/Hash映射+HashMap统计+堆/快速/归并排序分而治之/hash映射:......
  • 【算法】二分查找——BinarySearch
    一、概述二分查找又称折半查找,是一种能够大幅减少时间复杂度的查找方法,但是二分查找要求线性表必须词用顺序储存结构,而且表中元素按关键字有序排列。在后续讨论中,我们假设有序表递增有序。二分查找中使用的术语:目标Target——你要查找的值索引Index——你要查找的当前......
  • 代码随想录算法训练营第四十六天 | 背包问题总结篇!,关于多重背包,你该了解这些!,139.单词
    背包总结听说背包问题很难?这篇总结篇来拯救你了年前我们已经把背包问题都讲完了,那么现在我们要对背包问题进行总结一番。背包问题是动态规划里的非常重要的一部分,所以我把背包问题单独总结一下,等动态规划专题更新完之后,我们还会在整体总结一波动态规划。关于这几种常见......