快速排序 | C++|时间空间复杂度

news2024/11/24 11:06:06

1.概念

快速排序(QuickSort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

2.算法思想描述

1.进行一次划分:找一个基准(枢轴),经过一趟遍历从后往前找比基准小的记录,找到往前移,然后从前往后找比基准大的记录,找到往后移,直到以基准为中枢,将序列分为两部分,即基准左边的记录都小于基准右边的记录。

2.不断的将序列分为两部分,分别对子序列进行一份划分,直到序列不可在划分,达到整个序列有序。

 一次划分的思想:

 3.代码

#include<iostream>
using namespace std;
int Partition(int* arr, int low, int high)//O(n)
{
    int pivot = arr[low];//用子序列的第一个记录作为基准(枢轴)
    while (low < high)//从序列的两端交替向中间扫描
    {
        //从后往前找比基准小的记录,找到往前移
        while (low < high && arr[high] >= pivot) high--;
        if (low < high)
        {
            arr[low++] = arr[high];
        }
        //从前往后找比基准大的记录,找到往后移
        while (low < high && arr[low] <= pivot) low++;
        if (low < high)
        {
            arr[high--] = arr[low];
        }

    }
    arr[low] = pivot;//经过一次划分,将基准数字放在他该在的位置上(即基准左边的记录都小于基准右边的记录)
    return low;//返回基准(枢轴)所在的位置
}

void Quick(int* arr, int low, int high)//O(nlogn)
{
    if (low >= high) return;
    int pivot = Partition(arr, low, high);//将基准进行一次划分,序列分为两份
    Quick(arr, low, pivot - 1);//基准左边进行排序
    Quick(arr, pivot + 1, high);//基准右边进行排序
}

void QuickSort(int* arr, int len)
{
    Quick(arr, 0, len - 1);
}

void Show(int* arr, int len)
{
    for (int i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main()
{
    int arr[] = { 9,3,12,6,7,10,5,8,21,4 };//待排序序列
    int len = sizeof(arr) / sizeof(arr[0]);
    QuickSort(arr, len);
    printf("快速排序结果为:");
    Show(arr, sizeof(arr) / sizeof(arr[0]));
    return 0;
}

4.效率分析

时间复杂度:O(nlogn)

空间复杂度:O(logn) 因为递归调用栈,递归了logn次

稳定性:不稳定

快速排序缺点

越有序越慢,空间复杂度高,不稳定。

如果序列是升序或降序,则快排的时间和空间复杂度高

时间复杂度:O(n²) 一次排序O(n),递归调用O(n)

空间复杂度:O(n) 如果画成递归树,则是一颗斜树

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

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

相关文章

在线HmacMd5加密工具--在线获取哈希值又称摘要

具体请前往&#xff1a;在线计算HMacMd5工具

STL vector基本用法

目录 vector介绍vector的使用vector的定义vector接口函数构造函数和赋值重载迭代器元素访问vector容量相关函数vector增加 删除 修改操作关系操作符 vector介绍 vector是可变大小数组的序列容器。像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可…

Dockers搭建个人网盘、私有仓库,Dockerfile制作Nginx、Lamp镜像

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 &#xff08;1&#xff09;下载mysql:5.6和owncloud镜像 &#xff08;2&#xff09;创建启动mysql:5.6和owncloud容器 &#xff08;3&#xff09;在浏览器中输入网盘服务器的IP地址&#xff0c;进行账…

stm32单片机/51单片机蜂鸣器不响(proteus模拟)

蜂鸣器不发生原因就1个&#xff1a;电压不够 所以需要提高蜂鸣器2端的电压&#xff1a;可以采用的方法有&#xff1a; 1提高蜂鸣器电阻&#xff0c;这样根据分压原理&#xff0c;可以提升蜂鸣器2段电压 2更改蜂鸣器的工作电压为更小的值&#xff0c;这个可以通过在proteus内…

虚拟机中docker承载的微服务注册到nacos无法访问问题

今天将一个项目中的部分子系统部署&#xff0c;部署到虚拟机的docker里运行&#xff0c;结果外部无法访问。查看nacos&#xff0c;显示服务已经成功注册。 后来发现&#xff0c;该服务的IP地址外部无法访问&#xff1a; 估计172.17.0.0是docker自身的网段&#xff0c;在上面跑…

【MyBatis面试题(20道)】

文章目录 MyBatis 面试题&#xff08;20道&#xff09;基础1.说说什么是MyBatis&#xff1f;2.Hibernate和MyBatis有什么区别&#xff1f;3.MyBatis使用过程&#xff1f;生命周期&#xff1f;4.在mapper中如何传递多个参数&#xff1f;5.实体类属性名和表中字段名不一样&#x…

BDA初级分析——SQL多表连接应用

一、用SQL拼接数据 三个初始数据 问题1&#xff1a;在所有的数据里&#xff0c;销售额最高的产品品类名是什么&#xff1f; 问题2&#xff1a;是否有什么产品是在所观测的时间里没有被购买过的&#xff1f; 拼接数据&#xff1a;JOIN join&#xff0c;加入 作用&#xff1…

crontab下定时任务批量注释和批量放开

背景&#xff1a;实际项目中我们在Linux系统中用crontab配置了上百个定时任务&#xff0c;有的时候做配置修改等需要同时注释掉这些任务&#xff0c;让它们都不在执行&#xff0c;找了一会儿终于发现了解决办法&#xff0c;&#x1f604; 模拟项目中的任务如下 我就随机写了两…

最快的JS甘特图:Bryntum Gantt 5.5.1 Crack

最快的JS甘特图 Bryntum Gantt 是一个超快速且完全可定制的甘特图套件&#xff0c;适用于您的 React / Angular / Vue / JS 应用程序。 快如闪电 甘特图是用纯 JavaScript / ES6 构建的&#xff0c;并使用非常快速的渲染引擎。这意味着您可以加载大型数据集&#xff0c;并且仍然…

MNN学习笔记(八):使用MNN推理Mediapipe模型

1.项目说明 最近需要用到一些mediapipe中的模型功能&#xff0c;于是尝试对mediapipe中的一些模型进行转换&#xff0c;并使用MNN进行推理&#xff1b;主要模型包括&#xff1a;图像分类、人脸检测及人脸关键点mesh、手掌检测及手势关键点、人体检测及人体关键点、图像嵌入特征…

嵌入式:ARM Day6

作业:完成cortex-A7核UART总线实验 目的&#xff1a;1.输入a,显示b&#xff0c;将输入的字符的ASCII码下一位字符输出 2.原样输出输入的字符串 源码&#xff1a; uart4.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #incl…

个人论坛项目测试报告

目录 0.项目概述及部分测试用例展示 以下是部分测试用例&#xff1a; 进行一般的性能测试性能测试 1.摘要及版本修订记录 2.功能介绍 3.测试范围 3.1.功能性 3.2.可靠性 3.3.易用性 4.测试资源 4.1.人员介绍 4.2.测试环境 4.2.测试工具 5.测试策略 5.2.功能测试…

Vivado使用入门之三:I/O约束

一、导图概览 二、I/O约束 2.1 I/O约束的内容 I/O约束主要是对port的位置和电气特性进行设置&#xff0c;进入菜单栏Window的IO Ports&#xff0c;可以查看可约束的相关内容。 一些port的常用特性解释如下 Name: port的名称 Direction:port的输入输出类型&#xff0c;有三种…

后端开发12.商品模块

概述 简介 商品模块这个设计的非常复杂 效果图 数据库

【LeetCode-中等题】15. 三数之和

题目 题解一&#xff1a;双指针法 图解参考链接&#xff1a;画解算法&#xff1a;15. 三数之和 详解参考代码随想录讲的非常好 梦破碎的地方&#xff01;| LeetCode&#xff1a;15.三数之和 代码&#xff1a; class Solution {public List<List<Integer>> thre…

第 7 章 排序算法(5)(希尔排序)

7.8希尔排序 7.8.1简单插入排序存在的问题 我们看简单的插入排序可能存在的问题. 数组 arr {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是&#xff1a; {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} {2,3,3,4,5,6} {2,2,3,4,5,6} {1,2,3,4,5,6} 结论: 当需要插入的数…

Influxdb数据库(centos7)

Influxdb数据库 1、简介与使用场景 简介 InfluxDB是一个由InfluxData开发的开源时序型数据库&#xff0c;专注于海量时序数据的高性能读、高性能写、高效存储与实时分析等&#xff0c;在DB-Engines Ranking时序型数据库排行榜上排名第一&#xff1a; InfluxDB广泛应用于DevOps…

odoo 设备增加二维码 python生成二维码的一个有意思的问题

odoo 设备增加二维码 python生成二维码的一个有意思的问题 在odoo设备集成中根据客户要求&#xff0c;增加了一个二维码&#xff0c;想包含一些信息&#xff0c;用python的二维码库qrcode&#xff0c;qrcode是二维码生成的Python开源库。 代码如下: ewmny 设备&#xff1a; …

开源远程控制硬件 BliKVM v4测试 1000公里外远程重装系统

测试准备 测试时间&#xff1a;20230818 测试硬件&#xff1a;BliKVM v4 文档 BliKVM v4是一款生产就绪、即插即用的 KVM-over-IP 设备&#xff0c;为专业用户提供了远程服务器或工作站管理的便捷解决方案。 它基于Linux并且完全开源。 借助 BliKVM&#xff0c;您可以轻松打…

机器学习算法-随机森林

目录 机器学习算法-随机森林 &#xff08;1&#xff09;构建单棵决策树。 决策树的构建过程 决策树的构建一般包含三个部分&#xff1a;特征选择、树的生成、剪枝。 机器学习算法-随机森林 机器学习算法-随机森林 随机森林是一种监督式学习算法&#xff0c;适用于分类和回…