【数据结构实验】排序(三)快速排序算法的改进(三者取中法)

文章目录

  • 1. 引言
  • 2. 快速排序算法
    • 2.1 传统快速排序
    • 2.2 三者取中法
  • 3. 实验内容
    • 3.1 实验题目
      • (一)输入要求
      • (二)输出要求
    • 3.2 算法实现
  • 4. 实验结果

1. 引言

  快速排序是一种经典的排序算法,其核心思想是通过选择一个基准元素,将数组分为两个部分,左边的元素小于基准,右边的元素大于基准,然后对左右两部分递归地进行排序。然而,在处理基本有序数组时,传统的快速排序可能会退化为 O ( n 2 ) O(n^2) O(n2)的时间复杂度。为了解决这个问题,引入了三者取中法,通过选择数组中的三个元素并取其中值作为基准元素,能够在基本有序的情况下提高排序效率。

2. 快速排序算法

2.1 传统快速排序

  快速排序的核心思想是通过选择一个基准元素,将待排序的数组划分为两个部分,左边的元素小于基准,右边的元素大于基准,然后对左右两部分递归地进行排序,其时间复杂度:

  1. 最好情况: 每次分划都能将数组平均地划分成两部分,此时的时间复杂度为 O ( n l o g 2 n ) O(n log_2 n) O(nlog2n)
  2. 最坏情况: 每次分划都选择了数组中最小(或最大)的元素作为基准,导致每次分划只能减少一个元素,时间复杂度 O ( n 2 ) O(n^2) O(n2)
  3. 平均情况: 通过概率分析,可以证明时间复杂度为 O ( n l o g 2 n ) O(n log_2 n) O(nlog2n)

2.2 三者取中法

2. 算法描述:
  改进的快速排序算法主要区别在于基准元素的选择。在传统快速排序中,通常选择随机元素作为基准,而在改进算法中则采用三者取中法:
在这里插入图片描述
在这里插入图片描述

3. 实验内容

3.1 实验题目

  实现教材233 页下方提及的 Select 算法(求第 4 小元素)(要求文件长度大于等于 5 时调用 Partition2 算法,否则调用直接插入排序算法)。

(一)输入要求

第一组输入数据:
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
第二组输入数据:
{16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}

(二)输出要求

对每组输入数据,输出以下信息(要求必须要有关于输出数据的明确的提示信息)

  1. 输出分划次数;
  2. 输出找到第 4 小元素时文件的状态,即输出此时所有记录的值。

3.2 算法实现

#include<stdio.h>
void Change(int R[],int i,int j)
{int t=R[i];R[i]=R[j];R[j]=t;
}
int Partition2(int R[],int m,int n)
{Change(R,(m+n)/2,m+1);if(R[m+1]>R[n]) Change(R,m+1,n);if(R[m]>R[n]) Change(R,m,n);if(R[m+1]>R[m]) Change(R,m + 1,m);int i=m,j=n+1,K=R[m];while(i<j){i++;while(R[i]<=K) i++;j--;while(R[j]>K) j--;if(i<j)Change(R,i,j);}Change(R,m,j);return j;
}
void InsertSort(int R[],int len)
{int i,j,t;for(i=1;i<len;i++)if(R[i]<R[i-1]){t=R[i];R[i]=R[i-1];for(j=i-1;R[j]>t&&j>=0;j--){R[j+1]=R[j];}R[j+1]=t;}
}
int Select(int R[], int n)
{if(n>=5){int t=Partition2(R,1,n),rounds=0;rounds++;while(t!=4){if(t<4) t=Partition2(R,t+1,n);else t=Partition2(R,1,t-1);rounds++;}printf("分划次数为%d次\n",rounds);printf("找到第4小元素时文件状态为:");int i;for(i=0;i<n;i++)printf("%d ",R[i]);printf("\n");return R[4];}else{InsertSort(R,n);return R[4];}
}
int main()
{//int R[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};int R[16]={16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};printf("第4小元素为%d",Select(R,16));return 0;
}
  1. Change 函数用于交换数组中的两个元素。
  2. Partition2 函数使用中值法选择主元,并使用修改过的Lomuto分区方案对数组进行分区。它返回选择的主元的最终位置。
  3. InsertSort 函数对数组执行插入排序。
  4. Select 函数是主要的算法。如果数组的大小大于或等于5,它使用Partition2 函数递归地找到第4小元素。如果大小小于5,它使用 InsertSort 函数对数组进行排序,并返回第4个元素。

4. 实验结果

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

armbian折腾之docker搭建chatgptweb指导(无需魔法)

文章目录 前言面板/docker的安装获取中转Key创建docker容器chatgpt-next-web部署[推荐]chatgpt-Web部署 推荐学习openai-hk官方的部署指导 前言 好久都没有折腾armbian&#xff0c;导致吃了很长时间的灰&#xff0c;今天偶然看到B站UP主JeeJK007的搭建视频&#xff0c;便想着能…

小程序如何禁止指定用户访问?如何设置指定用户才能访问?

​有些商家为了价格保密或者实行严格的会员制等原因&#xff0c;希望小程序能够限制某些人的访问或者设置指定人员才能访问。这种功能在小程序中&#xff0c;怎么支持这些功能呢&#xff1f;下面具体介绍。 一、禁止指定用户访问 禁止指定用户访问&#xff0c;可以通过小程序…

智能汽车十大网络安全攻击场景-《智能汽车网络安全权威指南》

引言 大家都很熟悉OWASP Top 10风险报告&#xff0c;这个报告不但总结了Web应用程序最可能、最常见、最危险的10大安全隐患&#xff0c;还包括了如何消除这些隐患的建议&#xff0c;这个“OWASP Top 10“差不多每隔三年更新一次。目前汽车网络安全攻击威胁隐患繁多&#xff0c…

杰发科技AC7801——keil工程移植到IAR

0、简介 发现AC7801的代码只有keil工程的&#xff0c;IAR和Eclipse的代码只有一个例程&#xff0c;于是在从Keil移植到IAR时候遇到的问题记录下。 正常情况下&#xff0c;直接把keil的usr用户代码移植到iar的文件夹下面&#xff0c;删除原本的文件再添加新加进来的文件即可。…

链表?细!详细知识点总结!

链表 定义&#xff1a;链表是一种递归的数据结构&#xff0c;它或者为空&#xff08;null)&#xff0c;或者是指向一个结点&#xff08;node&#xff09;的引用&#xff0c;该结点含有一个泛型的元素和一个指向另一条链表的引用。 ​ 其实链表就是有序的列表&#xff0c;它在内…

03:2440--UART

目录 一:UART 1:概念 2:工作模式 3:逻辑电平 4:串口结构图 5:时间的计算 二:寄存器 1:简单的UART传输数据 A:GPHCON--配置引脚 B:GPHUP----使能内部上拉​编辑 C: UCON0---设置频率115200 D: ULCON0----数据格式8n1 E:发送数据 A:UTRSTAT0 B:UTXHO--发送数据输…

从0到0.01入门 Webpack| 004.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

ref详解(C#)

本质上来说 ref 的就是把 C/C 指针的那一套又拿回来了&#xff0c;而且还封装成一套自己的玩法。 我想设计者的初心把 ref 的功能限制得死死的&#xff0c;可能也考虑到 C# 是一门面向业务开发的语言&#xff0c;讲究的是做项目快狠准&#xff0c;性能反而不是第一要素&#x…

当你准备开始学习 Java 时,确保已完成以下准备工作,安装Java开发环境并验证通过。

当你准备开始学习 Java 时&#xff0c;确保已完成以下准备工作&#xff1a; a. 安装Java开发环境 下载Java Development Kit (JDK)&#xff1a; 访问Oracle官方网站&#xff0c;选择适用于你操作系统的JDK版本&#xff0c;点击下载。 安装JDK&#xff1a; 下载完成后&#xf…

3.1 CPU内部结构与时钟与指令

CPU内部结构 总线一些自定义部件总线图内存指令执行流程:取指令,译码,执行pc做的事内存地址寄存器内存缓存寄存器指令寄存器,译码第一步指令寄存器传递地址到内存地址寄存器指令MOV_A的过程(译码第二步)第一条指令执行完毕第三条指令的执行第四条指令第四条指令不同的执行流程…

基于python+TensorFlow+Django算法模型的车辆车型识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术栈主要模块1. 数据预处理2. 模型构建3. 模型训练4. 模型集成5. 用户界面 系统工作流程未来改进计划 二、功能三、系统四. 总结 一项目简介 # 车辆车…

深信服实验学习笔记——nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口&#xff08;TCP/UDP&#xff09;扫描4. 最详细的端口扫描5. 三种TCP扫描方式 1. 主机存活探测 nmap -sP <靶机IP>-sP代表 2. 常见端口扫描、服务版本探测、服务器版本识别 推荐加上-v参…

DNS/ICMP协议、NAT技术

目录 DNS协议DNS背景域名简介 ICMP协议ICMP功能ping命令traceroute命令 NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术的缺陷NAT和代理服务器 网络协议总结应用层传输层网络层数据链路层 DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&…

基于51单片机的公交自动报站系统

**单片机设计介绍&#xff0c; 基于51单片机的公交自动报站系统 文章目录 一 概要公交自动报站系统概述工作原理应用与优势 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 很高兴为您介绍基于51单片机的公交自动报站系统&#xff1a; 公交自动报…

吉他初学者学习网站搭建系列(1)——目录

文章目录 背景文章目录功能网站地址网站展示展望 背景 这个系列是对我最近周末搭建的吉他工具类平台YUERGS的总结。我个人业余爱好是自学吉他&#xff0c;我会在这个平台中动手集成我认为很有帮助的一些工具&#xff0c;来提升我的吉他水平和音乐素养&#xff0c;希望也可以帮…

【Linux】指令详解(三)

目录 1. 前言2. 常见指令2.1 重定向2.1.1 >2.1.2 >>2.1.3 < 2.2 与文件有关指令2.2.1 more2.2.2 less &#xff08;推荐使用&#xff09;2.2.3 head2.2.4 tail2.2.5 wc2.2.6 | 2.3 find2.4 grep 3. 时间相关的指令3.1 data3.2 时间戳3.3 cal 4. zip/unzip 1. 前言 …

rsyslog学习

rsyslog是什么 RSYSLOG&#xff08;Remote System Logging&#xff09;是一个开源的日志处理工具&#xff0c;用于在 Linux 和 Unix 系统上收集、处理和转发日志。它是一个健壮且高性能的日志处理程序&#xff0c;可以替换 Syslogd 作为标准的系统日志程序。RSYSLOG 提供了许多…

力扣学习笔记——239. 滑动窗口最大值

力扣学习笔记——239. 滑动窗口最大值 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输…

第96步 深度学习图像目标检测:FCOS建模

基于WIN10的64位系统演示 一、写在前面 本期开始&#xff0c;我们继续学习深度学习图像目标检测系列&#xff0c;FCOS&#xff08;Fully Convolutional One-Stage Object Detection&#xff09;模型。 二、FCOS简介 FCOS&#xff08;Fully Convolutional One-Stage Object D…

Javaweb之Vue组件库Element的详细解析

4 Vue组件库Element 4.1 Element介绍 不知道同学们还否记得我们之前讲解的前端开发模式MVVM&#xff0c;我们之前学习的vue是侧重于VM开发的&#xff0c;主要用于数据绑定到视图的&#xff0c;那么接下来我们学习的ElementUI就是一款侧重于V开发的前端框架&#xff0c;主要用…