快速排序算法解析

news2024/11/26 2:03:53

快速排序算法解析

在这里插入图片描述

快速排序法

快速排序是一种经典的分治算法,它采用递归的方式将待排序数组分割成较小的子数组,然后通过基准元素的选择和元素的交换来达到排序的目的。

快速排序的核心思想是通过选取基准元素,并将其他元素与基准元素进行比较,将小于基准元素的放在左边,大于基准元素的放在右边,从而使基准元素所处位置变为有序。然后再对左右两侧的子数组分别进行递归调用快速排序,以此实现整个数组的排序。

具体步骤如下:

  1. 选择基准元素:从待排序的数组中选择一个元素作为基准。选择合适的基准元素可以影响快速排序的效率。
  2. 分割操作:将数组分割为两部分,小于等于基准元素的放在左边,大于等于基准元素的放在右边。这一步可以使用双指针法或者挖坑法来实现。
  3. 递归排序:对划分后的左右子数组分别进行递归调用快速排序。
  4. 合并结果:将左子数组、基准元素和右子数组合并起来,得到最终的排序结果。

快速排序的关键在于划分操作,它通过多次交换元素的位置将基准元素放置到正确的位置上。通过每一轮划分操作,基准元素的位置已经确定,左边的元素都小于等于基准,右边的元素都大于等于基准。然后再对左右子数组进行递归排序,直到子数组长度为1或0时结束递归。

快速排序的优势在于它的平均时间复杂度为O(nlogn),并且具有原地排序(in-place)的特点,不需要额外的空间。然而,最坏情况下的时间复杂度为O(n^2),当待排序数组已经有序或近乎有序时,快速排序的效率会下降。为了避免这种情况,可以采用随机选取基准元素或者三数取中法来选择基准元素,以增加算法的稳定性和性能表现。

总结来说,快速排序是一种高效的排序算法,它基于分治的思想,通过选择基准元素和划分操作来实现对数组的排序。

代码举例

下面我将以Python代码为例,对几种常见的排序算法进行详细分析,大家可以对于一下几种进行性能分别测试

  1. 冒泡排序(Bubble Sort):
    冒泡排序是一种简单而直观的排序算法,它会多次遍历待排序的数组,每次比较相邻的两个元素并交换位置,直到整个数组有序。
def bubble_sort(arr):
    n = len(arr)
    for i in range(n-1):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr
  1. 插入排序(Insertion Sort):
    插入排序从数组的第二个元素开始,逐个将后面的元素插入到前面已排序的部分中,直到整个数组有序。
def insertion_sort(arr):
    n = len(arr)
    for i in range(1, n):
        key = arr[i]
        j = i - 1
        while j >= 0 and arr[j] > key:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = key
    return arr
  1. 选择排序(Selection Sort):
    选择排序每次在未排序的部分中找到最小的元素并放到已排序部分的末尾,重复该过程直到整个数组有序。
def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_index = i
        for j in range(i+1, n):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[i], arr[min_index] = arr[min_index], arr[i]
    return arr
  1. 快速排序(Quick Sort):
    快速排序使用分治法来快速地将数组分成两个子数组,一个小于基准元素,一个大于基准元素,然后递归地对子数组进行排序。
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr)//2]
    less = [x for x in arr if x < pivot]
    equal = [x for x in arr if x == pivot]
    greater = [x for x in arr if x > pivot]
    return quick_sort(less) + equal + quick_sort(greater)

这些是几种常见的排序算法的基本思想和示例代码。值得注意的是,不同的排序算法具有不同的时间复杂度和空间复杂度特性,因此在实际应用中需要根据具体情况选择合适的排序算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/750393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在工作中保持稳定的情绪? – 个人看法和建议

文章目录 每日一句正能量前言情绪波动的原因建议情绪调节技巧和策略身处逆境&#xff0c;如何治愈自己 后记 每日一句正能量 所谓的快乐&#xff0c;是指身体的无痛苦和灵魂的无纷扰。——伊壁鸠鲁 前言 在工作中保持稳定的情绪对于每一个职场人来说都是非常重要的。随着工作压…

什么是vlan为什么要划分vlan

首先了解交换机的数据的转发方式。&#xff0c;有两种情况会使用广播方式进行数据分发&#xff0c;第一种就是目的地址是全F的&#xff08;FF-FF-FF-FF-FF-FF&#xff09;&#xff0c;第二种是位置的单播帧&#xff0c;这样的情况下会带来什么杨的问题呢。 场景引入&#xff1…

Vue2 使用vcolorpicker报错问题解决

1、安装步骤省略 2、全局引入步骤省略 3、引入后注册组件会报如下错误 Failed to mount component: template or render function not defined. 按照文档给的例子直接这样写 不用注册组件就不报错了~

菜鸡shader:L10 帧序列动画和极坐标的使用

文章目录 帧序列动画代码最后效果 极坐标代码最后效果 顶点色 这次笔记就直接放最后的效果了&#xff0c;因为课程上老师也没有给代码图片或是什么技巧说明。 下图左边是帧序列动画(鬼火)&#xff0c;右边是极坐标。 帧序列动画 帧序列的原理是对一张有规律行列排序的序列帧…

35. 反转链表

目录 链接&#xff1a; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 图片&#xff1a; 链接&#xff1a; 原题链接 题目&#xff1a; 定义一个函数&#xff0c;输入一个链表的头结点&#xff0c;反转该链表并输出反转后链表的头结点。 思考题&#xff1a; 请同时…

逻辑(css)-背景网格制作(linear-gradient)

目录 linear-gradient需求实现 linear-gradient 语法&#xff1a;linear-gradient([direction], color-stop1, color-stop2, ...) 第一个参数为(可选)方向参数&#xff0c;可以是度数也可以是方位名词,方向与读书的关系如下&#xff1a; 角度方位文字说明示例0degto top从下…

centos7 环境下部署 nacos单机模式

1、官网下载 nacos 官网地址&#xff1a;home 去github上下载nacos-server。我下载的是 nacos-server-1.4.1.tar.gz 2、安装 nacos 下载完成后&#xff0c;将安装包上传到 centos 创建 nacos 目录&#xff08;安装位置任意&#xff09; mkdir -p /usr/local/nacos解压 nac…

springboot html乱码

一、问题重现 二、代码展示 代码的编码都是正常的 修改了File Encodings配置项&#xff0c;结果不管用 三、终极解决方案 终于解决

MATLAB 基于CPD的点云配准 (24)

MATLAB 基于CPD的点云配准 (24) 一、算法简介二、具体使用1.代码(注释详细)2.函数介绍3.使用技巧4.重复叠加配准效果如何一、算法简介 MATLAB 中包含了一种基于CPD的点云配准方法,这里对其进行使用,查看其配准效果,结果来看如上图所示,还是可用的。 二、具体使用 1.代…

模板类和友元

模板类和友元 非模板友元约束模板友元 非模板友元 友元函数不是模板函数&#xff0c;而是利用模板类参数生成的函数&#xff0c;只能在类内实现。 友元函数访问类的私有变量的方法&#xff1a; 将模板类的引用传递给友元函数&#xff1a; 测试调用&#xff1a; 对于有多个…

Android oom_adj 更新原理(二)

源码基于&#xff1a;Android R 接上一篇&#xff1a;Android oom_adj 更新原理(一) 12. computeOomAdjLocked() frameworks/base/services/core/java/com/android/server/am/OomAdjuster.javaprivate final boolean computeOomAdjLocked(ProcessRecord app, int cachedAdj,Pr…

深入解析Android Lifecycle;从基本使用到源码实现,全面掌握生命周期管理

Lifecycle 是 Android Jetpack 中的一个组件&#xff0c;用于管理 Android 应用组件&#xff08;如 Activity 和 Fragment&#xff09;的生命周期。通过使用 Lifecycle&#xff0c;开发者可以更容易地管理组件的生命周期并执行相关的操作。 Lifecycle 提供了一组生命周期事件&…

关于torch.load()更改了cuda位置还是cuda内存不够的问题

关于torch.load()变了cuda位置还是cuda内存不够的问题 问题背景&#xff1a;在一次任务中&#xff0c;由于需要使用cuda进行代码运行&#xff0c;但是分明修改了cuda到一个空闲的卡位置&#xff0c;但是依然抱错cuda out of memory的问题 在任务中&#xff0c;最开始原始代码是…

Node+mysql-注册和登录账号实现(原生)

1.创建数据表 说明&#xff1a;创建id&#xff0c;username,password字段&#xff0c;并设置了类型。 2.导入mysql库 npm i mysql2.18.1 3.创建了db文件夹 说明&#xff1a;创建mysql数据池 // 导入mysql包 const mysqlrequire("mysql") // 创建mysql连接池 const…

react-flow实现dag工作流

1. 官方文档 Introduction to React Flow 2.效果 3. 代码 index.jsx import { useState, useCallback, useEffect } from react; import ReactFlow, {Controls,Background,applyNodeChanges,applyEdgeChanges,addEdge,ReactFlowProvider,useReactFlow } from reactflow;…

C++编程(二)—— 设计模式

文章目录 单例模式饿汉式单例模式懒汉式单例模式懒汉式单例模式2 工厂模式&#xff08;创建型模式&#xff09;简单工厂工厂方法抽象工厂总结 单例模式 一个类不管创建多少次多线&#xff0c;永远只能得到该类型一个对象的实例。 A* p1 new A(); A *p2 new A(); A *p3 new…

msvcr110.dll丢失的修复教程,找不到msvcr110.dll解决办法哪个更推荐

msvcr110.dll是微软的Visual C运行库文件之一。它是Microsoft Visual Studio 2012的一部分&#xff0c;用于支持运行在Windows操作系统上使用Visual C编写的应用程序。在Windows系统中非常重要&#xff0c;如果丢失或是损坏就会造成很多程序无法启动运行。 会出现以下的报错提…

将C++对象注册成QML控件并提供可被调用的函数

0x00 使用QML编写界面 import QtQuick 2.14 import QtQuick.Window 2.14 import QtQuick.Controls 1.4 import QtQuick.Controls 2.12 as Controls import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Material 2.12 //import com.HLD 1.0Window {visible: true;mini…

赛效:WPS文档怎么在文本中插入连续的编号

1&#xff1a;打开一个WPS文档&#xff0c;全选所有的段落。 2&#xff1a;点击“开始”选项卡里点击编号下拉菜单&#xff0c;选择一种编号样式并点击。 3&#xff1a;我们会看到每段前面已经自动出现编号&#xff0c;而且是连续的。这个时候&#xff0c;我们在文档末尾新增一…

基于串行和并行ADMM算法在分布式调度中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…