首页 > 编程语言 > 算法之快速排序2基准元素的选择

算法之快速排序2基准元素的选择

时间:2023-12-03 20:31:59浏览次数:41  
标签:分治 数列 基准 元素 选择 算法 排序 复杂度

一:概述

基准元素,英文是pivot,在分治的过程中,基准元素为中心,把其他的元素移动到它的左右两边。

二:具体说明

最简单的方式就是选择数列的第1个元素。

                                        算法之快速排序2基准元素的选择_时间复杂度

这种选择在绝大多数情况下是没有问题的。但是,假如有一个原本逆序的数列,期望排列成顺序数列,那会出现什么情况呢?

                                        算法之快速排序2基准元素的选择_快速排序_02

整个数列被分成了两部分,每一轮都只确定了基准元素的位置。数列的第一个元素要么是最小值,要么是最大值,根本无法发挥分治法的优势。在这种极端的情况下,快速排序需要进行n轮,时间复杂度退化成了O(n^2)。

为了避免这种情况的发生,可以采取下面的方式去解决。

其实,我们可以随机选择一个元素作为基准元素,并且让基准元素和数列首元素交换位置。

                                        算法之快速排序2基准元素的选择_快速排序_03

这样一来,即使在数列完全逆序的情况下,也可以有效的将数列分成两部分。当然,即使是随机选择基准元素,也会有极小的几率选到数列的最大值或最小值,同样会影响到分治的效果。

所以,虽然快速排序的平均时间复杂度是O(nlogn),但最坏的情况下的时间复杂度是O(n^2)。在后文中,为了简化步骤,省去了随机选择基准元素的过程,直接把首元素作为基准元素。

标签:分治,数列,基准,元素,选择,算法,排序,复杂度
From: https://blog.51cto.com/u_15912723/8669021

相关文章

  • 栈和队列算法总结
    知识概览在数据结构中,栈和队列都属于线性表。栈是先进后出(FILO)的,队列是先进先出(FIFO)的。代码模板#include<iostream>usingnamespacestd;constintN=100010;//**********************栈intstk[N],tt;//插入stk[++tt]=x;//弹出tt--;//判断栈是否......
  • 链表算法总结
    知识概览链表包括单链表和双链表,这里讨论算法题中的链表。为了考虑算法题中对于时间效率的要求,链表通常是用数组模拟成静态链表的形式,速度快。单链表可以用来写邻接表(包括n个链表),邻接表可以存储树和图,最短路问题、最小生成树问题、最大流问题都可以用邻接表来存储。双链表用来......
  • 【教3妹学编程-算法题】拼车
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开发。3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。2哥:是啊,立冬之后天气多以多云为主,好不容易艳阳高照。可是你不能秋游,赶紧收拾收拾上班去啦3妹:哼,好吧~2哥:给你出了一道题......
  • 文心一言 VS 讯飞星火 VS chatgpt (148)-- 算法导论12.2 3题
    三、用go语言,写出过程TREE-PREDECESSOR的伪代码。文心一言:以下是使用Go语言编写的TREE-PREDECESSOR函数的伪代码:funcTREE-PREDECESSOR(node){ifnode.parent!=nil{returnnode.parent}//如果节点是根节点,则返回nilifno......
  • C语言冒泡排序法
    引言冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。冒泡的实现在细节上可以有很多种变化。最简单排序实现/*对顺序表L做交换排序*/voidBubbleSortO(SqList*L){ inti,j;for(i=1;i<L->length;i++) { fo......
  • 前缀和/差分——acwing算法基础课笔记
    个人笔记,欢迎补充,指正。一维前缀和对于数组:a[1],a[2],a[3]...a[n];其前缀和数组为s[i]=a[1]+a[2]+...+a[i];下标必须从1开始求前缀和1for(inti=1;i<n;++i)2s[i]=s[i-1]+a[i];s[0]需要定义为0作用求原数组里一段数(l,r)的和......
  • 链表为什么适合归并排序而不是快速排序?
    链表适合归并排序而不是快速排序的原因主要有以下几点:内存访问模式:快速排序的效率主要来源于引用的局部性,计算机硬件在这里得到了优化,因此访问彼此相邻的内存位置往往比访问分散在内存中的内存位置更快。然而,链表单元格经常分散在内存中,所以访问相邻的链表单元格没有局部性......
  • 代码随想录算法训练营第3天 | leetcode203、leetcode707、leetcode206
    (本合集全部为Go语言实现)相关文章链接:203题解707题解206题解相关视频链接:Leetcode203状态:秒了实现过程中的难点:链表遍历一定要记得指针后移。另外,在头指针前加入一个新的临时头节点可以统一整个遍历过程,否则需要先确定初始时两指针的状态个人写法/***Definitionfo......
  • 堆排序
    目录1.基本原理2.例子3.代码实现本文主要介绍堆排序的原理、例子以及代码实现。1.基本原理堆排序(HeapSort)是一种基于比较的排序算法,它的工作原理是首先将待排序的序列构造成一个大顶堆或小顶堆,然后交换堆顶元素和最后一个元素,然后将剩余元素重新调整为大顶堆或小顶堆,再交换堆......
  • 文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题
    二、用go语言,位向量(bitvector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为O(1)。文心一言,代码正常运行:在Go语言中,我们可以使用map[int]bool来......