深入理解快速排序

news2024/12/24 20:31:28

一、快速排序

        快速排序是冒泡排序的一种改进算法,相比于冒泡排序效率更优。

算法过程分析:

        通过采用分治策略,围绕一个 x 将原始数组划分为两个子数组,使得前一个子数组的元素≤ x ≤ 后一个子数组元素,对两个子数组进行递归排序,再合并成一个有序数组。

        1.选取一个基准元素 key(通常默认为数组的最左端),通过 key 将数组分为左右两端,使得左端数组全部 ≤ 基准元素 key ,右端数组全部元素 ≥ 基准元素key。

        2.两端数组可以独立排序。对于左端数组,又可以取一个基准元素,将该端数组元素分成左右两部分,使得左端数组全部 ≤ 基准元素 key ,右端数组全部元素 ≥ 基准元素key。右侧数组做类似处理。

        3.通过递归重复上述操作,当全部递归结束时,原数组也排序完成。

 细节分析:

        步骤1:将数组如何分成两个子数组,使得左端数组全部 ≤ 基准元素 key ,右端数组全部元素 ≥ 基准元素key

①j从右向左,找到小于key的数组元素

②i从左向右,找到大于key的数组元素,将二者交换。

③上述操作直至 i==j 时结束 

④此时再将基准值与 a[i](或a[j],i==j)交换,就使得两个子数组上述条件成立。

int i=left,j=right;
while(i!=j)
{
	while(a[j]>=temp && i<j) j--;
	while(a[i]<=temp && i<j) i++;
	swap(a[i],a[j]);
}
swap(a[left],a[i]); 

         步骤2:

分治策略,将左右两个子数组进行相同的操作。

quick_sort(left,i-1);
quick_sort(i+1,right);

 重复操作,通过递归分别进入两个子数组操作。

当全部返回时,结束递归,数组完成排序。

        思考:为什么 i 从左往右移动,j从右往左移动时,j 先移动?

  因为当 i 先移动时,i 一定会往右至少移动一次,出现以下情况:

① i 不停移动,直至移动到数组右端,此时交换i,j,出现错误,如图。

② i 先移动,移动到中间某个点时,j再移动,移动到i,j相等时交换,出现错误。

相反,如果是 j 先移动, 都能使得正确交换,必须先找到小于基准值key的元素

二、快速排序完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[10001];
int n;
void swap(int a1,int b1)    {int w=a[a1];a[a1]=a[b1];a[b1]=w;}  //交换函数
void qsort1(int begin,int end) // 快排的实现
{
    if(begin > end)  return ;  // 退出快排函数 避免出现死循环
    int tem=a[begin];    // 记录基准点
    int i=begin,j=end;
    while(i!=j)
    {
        while(a[j]>=tem && i<j)   j--;  //从右边开始找小于基准点的数
        while(a[i]<=tem && i<j)   i++;  //从左边开始找大于基准点的数
        if(i<j) swap(i,j);    
    }
    a[begin]=a[i]; // 交换基准点和第i个 确保基准点左边全部比其小 右边全部不它大
    a[i]=tem;
    qsort1(begin,i-1);  // 继续分成两个部分进行快速排序
    qsort1(i+1,end);
 
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    qsort1(1,n);
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
   // system("pause");
    return 0;
}

三、算法的性能分析

时间复杂度:

        理想情况:每次都尽可能将左端数组和右端数组等分递归,这样通过计算得出

                T(n)=2T(\frac{n}{2})+\Theta (n)

           时间复杂度与归并排序相同,为  O(nlogn) 

        最差情况:不难发现,当排序数组为顺序或者逆序时,每次 i,j 的移动都是从左到右

                时间计算 会与冒泡排序相同        复杂度为 O(n^{2})

            一般情况下,快速排序的时间复杂度为 O(nlogn),但是不稳定。

  洛谷—排序P1177  这道题,数据仍然卡快速排序,时间复杂度来到  O(n^{2}) ,需要对其进行优化。

四、快速排序优化

         上述快速排序总是将基准值默认为数组中第一个元素,当数组成顺序或者逆序时,出现最慢的情况。

        优化方法:在排序数组中随机选择一个数作为基准数进行排序。

基准数随机的结果:

         ①运行时间与输入数据的次序无关

        ②无特定输入数据匹配最差情况

        ③最差情况仅仅由随机数生成器所决定

对随机化快速排序的时间复杂度:O(nlogn)  (不稳定)

四、sort() 函数

        在C++中使用sort()函数需要使用#include<algorithm>头文件。algorithm意为"算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数。

 可以简单使用 sort() 函数对数组进行排序

#include<stdio.h>
#include<string.h>
#include<algorithm>
int main()
{
    int n,a[10001];
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+1+n); // 使数组从  a[1] 到 a[n] 排序
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
    return 0;
}

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

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

相关文章

诗词生成之setting

先上代码&#xff1a; # 禁用词&#xff0c;包含如下字符的唐诗将被忽略 DISALLOWED_WORDS [&#xff08;, &#xff09;, (, ), __, 《, 》, 【, 】, [, ]] # 句子最大长度 MAX_LEN 64 # 最小词频 MIN_WORD_FREQUENCY 8 # 训练的batch size BATCH_SIZE 16 # 数据集路径 DA…

如果电脑缺少dll文件怎么解决?如何快速解决dll丢失问题

最近有小伙伴问电脑老是缺少dll文件&#xff0c;这种问题到底要怎么去解决呢&#xff1f;其实这种现象是正常的&#xff0c;为啥说正常呢&#xff0c;下面我们会给大家详细的讲解dll为啥会缺少&#xff0c;然后还会讲解电脑缺少dll文件怎么解决的方法&#xff0c;好了&#xff…

Day17:开发流程、开发社区首页、项目的调试、版本控制

开发流程 一次请求过程 先开发DAO&#xff0c;再开发service&#xff0c;再开发controller 开发社区首页的分布实现 显示前10个帖子 创建帖子数据表 CREATE TABLE discuss_post (id int NOT NULL AUTO_INCREMENT,user_id varchar(45) DEFAULT NULL,title varchar(100) DEF…

社交创新的先锋:探秘Facebook背后的故事与智慧

起源与初创阶段 Facebook的故事始于2004年&#xff0c;由马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;、埃迪华索伦&#xff08;Eduardo Saverin&#xff09;、安德鲁麦克卡拉姆&#xff08;Andrew McCollum&#xff09;、克里斯休斯&#xff08;Chris Hughes&#x…

Java进程CPU高负载排查

Java进程CPU高负载排查步骤_java进程cpu使用率高排查_YouluBank的博客-CSDN博客 【问题定位】使用arthas定位CPU高的问题_arthas cpu高_秋装什么的博客-CSDN博客 CPU飙升可能原因 CPU 上下文切换过多。 对于 CPU 来说&#xff0c;同一时刻下每个 CPU 核心只能运行-个线程&…

JAVA实战开源项目:生活废品回收系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

最新APP开发趋势,探索2024年的创新与挑战

2024年&#xff0c;移动应用市场仍然是创新与变革的焦点。随着技术的不断发展和用户需求的不断变化&#xff0c;APP开发行业也在不断演进。本文将深入探讨2024年最新的APP开发趋势&#xff0c;以及所带来的创新与挑战&#xff0c;并介绍虎克技术公司提出的解决方案。 1. 强调用…

AIGC笔记--Maya提取和修改FBX动作文件

目录 1--Maya数据解析 2--FBX SDK导出6D数据 3--6D数据映射和Maya可视化 完整项目代码&#xff1a;Data-Processing/FBX_SDK_Maya 1--Maya数据解析 在软件Maya中直接拖入FBX文件&#xff0c;可以播放和查看人体各个骨骼关节点的数据&#xff1a; 对于上图来说&#xff0c;…

【傻瓜文档】鼎利测试软件Pilot Pioneer-① Pioneer界面介绍

Pioneer界面分布 工具栏 自定义快速访问工具栏 根据需求&#xff0c;自行制定工具栏选项 菜单栏 文件 语言 配置 工具 工具栏的补充内容&#xff0c;常用的有&#xff1a;合并/分割数据、GPS轨迹补偿等等。 帮助

亿发定制:中小型生产制造工厂为什么需要建设企业信息化管理?

随着互联网行业的迅猛发展&#xff0c;越来越多的加工制造业企业将互联网作为核心枢纽&#xff0c;这一关键核心枢纽即为企业信息化管理。 在企业信息化管理中&#xff0c;主要包括三个关键方面&#xff1a;企业变革过程管理、企业运作管理&#xff0c;以及信息技术、信息资源…

【YUNBEE云贝技术分享】如何定位postgreSQL数据库中未被使用过的索引

注: 本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 前言 在生产环境上&#xff0c;由于不规范的优化措施&#xff0c;数据库中可能存在大量的索引&#xff0c;并且相当一部分的索引…

jeecgboot 开放页面权限,免登录访问

前端需要配置路由和添加白名单 1、配置路由 2、 在permission.js里&#xff0c;把刚才的路由添加到白名单 3、 后端需要把该页面涉及到的接口排除权限拦截 比如我这个页面涉及到两个接口&#xff1a; 那么就在后端的excludeUrls把这两个接口加进去。 前端后端都设置好了&…

idea实现ssh远程连接服务器

1. 首先&#xff0c;打开idea&#xff0c;点击左上角File->settings 2. 点击tools->SSH Configurations->填写必要的信息&#xff0c;Host就是访问服务器的ip地址&#xff0c;Username就是服务器的用户账户&#xff0c;比如root&#xff0c;Password账户对应的密码&am…

智慧城市与绿色出行:共同迈向低碳未来

随着城市化进程的加速&#xff0c;交通拥堵、空气污染、能源消耗等问题日益凸显&#xff0c;智慧城市与绿色出行成为了解决这些问题的关键途径。智慧城市利用信息技术手段&#xff0c;实现城市各领域的智能化管理和服务&#xff0c;而绿色出行则强调低碳、环保的出行方式&#…

【Golang】golang使用三方SDK操作容器指南

【Golang】golang使用三方SDK操作容器指南 大家好 我是寸铁&#x1f44a; 总结了一篇 golang使用三方SDK操作容器✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 这应该是目前全网最全golang使用三方SDK操作容器的指南了✌️ CreateConfig 主要是创建容器的配置信息&#xff0c;常…

【Java从发入门到精通】Java StringBuffer 和 StringBuilder 类

Java StringBuffer 和 StringBuilder 类 当对字符串进行修改的时候&#xff0c;需要使用 StringBuffer 和 StringBuilder 类。 和 String 类不同的是&#xff0c;StringBuffer 和 StringBuilder 类的对象能够被多次的修改&#xff0c;并且不产生新的未使用对象。 在使用 Stri…

#QT(QSpinBox,QDoubleSpinBox)

1.IDE&#xff1a;QTCreator 2.实验:实现一个计价工具&#xff0c;进制转换工具。 教程来自&#xff1a;阿西拜编程 QT C 5.9 3.记录 设置进制的第二种方法 ui->hex_tx->setDisplayIntegerBase(16); //设置显示进制为16进制 4.代码 widget.cpp #include "wi…

NOIP2018-S-DAY1-3-赛道修建(洛谷P5021)的题解

目录 题目 原题描述&#xff1a; 题目描述 输入格式 输出格式 输入输出样例 主要思路&#xff1a; check&#xff1a; 真正的code: 原题描述&#xff1a; 题目描述 C 城将要举办一系列的赛车比赛。在比赛前&#xff0c;需要在城内修建 条赛道。 C 城一共有 个路…

天梯赛的赛场安排(Python)

作者 陈越 单位 浙江大学 天梯赛使用 OMS 监考系统&#xff0c;需要将参赛队员安排到系统中的虚拟赛场里&#xff0c;并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们&#xff0c;以便发放比赛账号。为了尽可能减少教练和监考的沟通负担&#…

打造私人云笔记,创造舒适的写作空间

搭建Minio 图片文件服务器 &#xff08;树莓派4B搭建Minio公网云服务器用nps内网穿透&#xff09;Typora 安装客户端 --> 可以利用免费gitee管理文档利用Typora 图像自定义文件上传功能 Minio强大的API功能 一、树莓派4B 64bit raspberry 操作系统 Docker Minio 图片文件…