深入理解快速排序

一、快速排序

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

算法过程分析:

        通过采用分治策略,围绕一个 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.mzph.cn/news/741054.shtml

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

相关文章

C语言练习题day3

编写一个程序给定两个数字(每个数字均为2位数),根据要求获得新数 并完成打印 新数的千位是第一个数的个位 新数的百位是第一个数的十位 新数的十位是第二个数的十位 新数的个位是第二个数的个位 #include<stdio.h>int main(void…

WebGIS开发0基础必看教程:鹰眼的实现思路

1.背景 鹰眼功能是WebGIS中的一种常见功能&#xff0c;利用一些开源的框架实现起来非常方便。当然&#xff0c;按照博主从底层谈WebGIS这套系列的风格&#xff0c;在这里还是跟大家一起探讨探讨不借助第三方框架开发鹰眼的简单实现思路。 2.鹰眼功能分析 3.实现思路设计 3.1…

C++内存对齐知识点总结

什么是内存对齐 理论上&#xff1a;32位系统&#xff1a;int 4字节&#xff0c;char1字节 现代计算机内存空间都是按照字节划分的。理论上计算机系统对基本类型数据在内存的变量的访问可以从任何地址开始&#xff0c;但是时机的计算机系统对基本类型的数据在内存中存放的位置是…

C语言 - 堆栈二叉树的基础及应用

1.历史 堆栈是为了减少程序内存占用的问题而发明的 机器上电后&#xff0c;所有的变量都需要copy到内存中运行&#xff0c;但是机器的内存大小一直都是比较有限的&#xff0c;所以堆栈和局部变量两个概念被提出来 2.栈 每次手动创建、删除变量非常麻烦&#xff0c;于是…

OpenCV-图像基础处理

目录 1 彩色&#xff08;RGB&#xff09;图像 2 灰度图像 3 黑白图像 1 彩色&#xff08;RGB&#xff09;图像 使用cv2.imread()函数加载RGB图像&#xff1b;使用cv2.split()函数分割颜色通道&#xff1b;将BGR颜色格式转换成RGB颜色格式&#xff1b;使用matplotlib或cv2.i…

【spring】@Bean注解学习

Bean介绍 Bean用于指示一个方法应该产生一个Bean对象&#xff0c;并将其交给Spring容器管理。 当使用Bean注解的方法被Spring容器调用时&#xff0c;它只会执行一次&#xff0c;随后该方法返回的Bean对象会被添加到Spring的IOC&#xff08;Inversion of Control&#xff0c;控…

【C#】【SAP2000】读取SAP2000中单元截面信息和几何信息到Grasshopper中

if (build true){// 声明变量int ret;int Numit 0;int[] ObjType new int[0];string[] ObjName new string[0];string sauto "";string propname "";string point1 "";string point2 "";double x1 0;double y1 0;double z1 …

静电ESD整改:原因、影响与解决方案详解?|深圳比创达电子

静电&#xff08;ESD&#xff09;是在日常生活和工作中常见的现象&#xff0c;但它可能对电子设备和器件造成严重的损坏。本文将介绍静电ESD的定义、原因、影响以及解决方案&#xff0c;帮助大家更好地了解ESD问题&#xff0c;并采取相应的整改措施。 一、静电ESD的定义 静电…

计算机网络 应用层的考纲内容 网络应用模型 域名系统

包括&#xff0c; 1&#xff0c;网络应用模型&#xff0c;包括&#xff1a;客户/服务器模型&#xff1b;P2P模型。 2&#xff0c;域名系统DNS&#xff0c;层次域名空间&#xff0c;域名服务器&#xff0c;域名解析过程。 3&#xff0c;文件传输协议&#xff0c;FTP&#xff…

基础的正则表达式

正则表达式&#xff08;Regular Expression&#xff0c;简称正则或RegExp&#xff09;是用于匹配字符串中字符组合的表达式。它是一种强大的工具&#xff0c;可以用于搜索、替换和提取字符串中的文本。 正则表达式由字符和操作符构成&#xff0c;用于描述字符串模式。以下是一些…

LeetCode1.两数之和

LeetCode第一题&#xff0c;两数之和 因为是第一题所以热度比较高&#xff0c;有很多种解法 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应…

L2-4 寻宝图(Python3)

给定一幅地图&#xff0c;其中有水域&#xff0c;有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏&#xff0c;这些有宝藏的点也被标记出来了。本题就请你统计一下&#xff0c;给定的地图上一共有多少岛屿&#xff0c;其中有多少是有宝藏的岛屿。 输入格式&#xf…

Python Excel 文本编辑库之xlsxwriter使用详解

概要 在现代数据处理和报表生成中,Excel 文件是一个非常常见的格式。Python XlsxWriter 库是一个强大的工具,可以帮助开发者轻松创建和编辑 Excel 文件,并且具有高度的灵活性和可定制性。本文将全面介绍 XlsxWriter 库的原理、功能、用法,并通过丰富的示例代码来展示其强大…

什么是工业数采网关?如何远程数采?

随着工业自动化的不断发展&#xff0c;数据采集与远程控制成为了生产过程中不可或缺的一环。而工业数采网关&#xff0c;作为连接工业设备与上位管理系统之间的桥梁&#xff0c;扮演着越来越重要的角色。HiWoo Box 作为一款优秀的工业数采网关产品&#xff0c;为 PLC、传感器、…

AI大语言模型GPT R 生态环境领域数据统计分析

自2022年GPT&#xff08;Generative Pre-trained Transformer&#xff09;大语言模型的发布以来&#xff0c;它以其卓越的自然语言处理能力和广泛的应用潜力&#xff0c;在学术界和工业界掀起了一场革命。在短短一年多的时间里&#xff0c;GPT已经在多个领域展现出其独特的价值…

小脑萎缩患者的饮食秘籍,让生活更加精彩!

在面对小脑萎缩这一挑战时&#xff0c;正确的饮食习惯能够为患者带来巨大的改变。今天&#xff0c;让我们一起探索如何通过饮食的力量&#xff0c;帮助小脑萎缩患者改善生活质量&#xff0c;让每一天都充满希望和活力&#xff01; 小脑萎缩患者的饮食应以均衡为原则&#xff0…

软raid sync_action

控制节点&#xff1a; /sys/block/md127/md/sync_action内核是怎么实现的&#xff0c;为什么mdadm管理命令仅支持四种&#xff1f; [rootgitclient ~]# mdadm --action --help mdadm: action must be one of idle, frozen, check, repair内核文档是怎么描述这个节点&#xff…

比特币如何运作?区块链、网络、交易

文章目录 一、比特币基础知识1.1 什么是比特币&#xff1f;1.2 比特币关键术语解释 二、区块链&#xff1a;比特币的支柱2.1 区块链如何运作2.2 什么是哈希&#xff1f;2.3 采矿的作用2.4 为什么区块链如此重要 三、密码学简介3.1 什么是密码学&#xff1f;3.2 密码学在比特币运…

2024年第十五届蓝桥杯第三期(校内)模拟赛题解

第一题 6 【问题描述】 请问 2023 有多少个约数&#xff1f;即有多少个正整数&#xff0c;使得 2023 是这个正整数的整数倍。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只填写这个整数&#…

蓝牙系列十五:协议栈GAP层分析

Generic Access Profile&#xff08;通用访问规范&#xff09; 它在用来控制设备连接和广播&#xff0c;用于提供蓝牙设备的通用访问功能&#xff0c;包括设备发现、连接、鉴权、服务发现等等。 GATT是建立连接后通信规范&#xff0c; 而蓝牙是通过GAP建立通信的。 GAP 使你的…