hnust 1815: 算法10-6~10-8:快速排序

news2024/12/24 21:45:05

hnust 1815: 算法10-6~10-8:快速排序

题目描述
快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别对这两个部分继续进行排序,从而使整个序列有序。
快速排序的算法可以描述如下:
在这里插入图片描述

在本题中,读入一串整数,将其使用以上描述的快速排序的方法从小到大排序,并输出。

输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入 Copy
10
2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
提示
在本题中,需要按照题目描述中的算法完成快速排序的算法。
快速排序是一种十分常用的排序算法,其平均时间复杂度为O(knlnn),其中n为待排序序列中记录的个数,k为常数。大量的实际应用证明,在所有同数量级的此类排序算法中,快速排序的常数因子k是最小的,因此,就平均时间而言,快速排序是目前被认为最好的一种内部排序方法。
而在C语言的常用编译器中,qsort函数是一个非常常用的快速排序函数。

解题过程

快速排序是一种高效的排序算法,使用分治法(Divide and Conquer)策略来把一个序列分为较小的两个子序列,然后递归地排序两个子序列。

题干代码解析
图片中提供的代码是快速排序算法(Quick Sort)的实现,它由两个主要部分组成:分区函数 Partition 和快速排序函数 QSort。以下是对代码的详细解析:

Partition 函数:

  • 函数作用:对顺序表的一个子序列进行分区操作,使枢轴元素(pivot)最终位于它最终排序的位置,并使所有比它小的元素位于它左边,所有比它大的元素位于它右边。
  • 参数:
    • SqList &L:引用传递的顺序表。
    • int low:子序列的起始索引。
    • int high:子序列的结束索引。
  • 过程:
    • 选择 L.r[low] 作为枢轴记录 pivotkey
    • 使用两个指针 lowhigh,从两端交替向中间扫描,直到 lowhigh 相遇。
    • L.r[high].key 小于或等于 pivotkey 时,将 high 指针向左移动。
    • L.r[low].key 大于 pivotkey 时,将 low 指针向右移动,并交换 L.r[low]L.r[high]
    • lowhigh 相遇时,将枢轴记录移动到它最终的位置 L.r[low]
    • 返回枢轴记录的位置。

QSort 函数:

  • 函数作用:递归地对顺序表的子序列进行快速排序。
  • 参数:
    • SqList &L:引用传递的顺序表。
    • int low:子序列的起始索引。
    • int high:子序列的结束索引。
  • 过程:
    • 如果 low 小于 high,说明子序列长度大于1,需要排序。
    • 调用 Partition 函数对子序列进行分区,得到枢轴位置 pivotloc
    • 对枢轴左边的子序列 L.r[low...pivotloc-1] 递归调用 QSort 进行排序。
    • 对枢轴右边的子序列 L.r[pivotloc+1...high] 递归调用 QSort 进行排序。

QuickSort 函数:

  • 函数作用:快速排序算法的入口函数,对整个顺序表进行排序。
  • 参数:
    • SqList &L:引用传递的顺序表。
  • 过程:
    • 调用 QSort 函数,传入顺序表 L,以及起始索引1和结束索引 L.length

代码逻辑分析:

  • 快速排序是一种分治算法,它通过递归地将数据分为较小的子问题来解决。
  • 算法的关键在于分区操作,它通过选取一个枢轴元素,将数据分为两部分,使得左边的所有元素都不大于枢轴,右边的所有元素都不小于枢轴。
  • 通过递归地对子序列进行快速排序,最终达到整个序列有序的目的。

注意事项:

  • 快速排序的性能在最坏情况下是 O(n^2),但平均情况下是 O(n log n),这取决于枢轴的选择。
  • 快速排序是不稳定的排序算法,因为相同元素的顺序可能会在分区过程中改变。
  • 快速排序通常需要随机化处理来避免最坏情况的发生,特别是在输入数据已经有序或接近有序的情况下。



以下是对小编的高中模板递归方法快速排序的详细讲解

  1. 函数定义

    • quick_sort(int q[], int l, int r):这是快速排序的递归函数,接收一个整数数组 q 和两个整数 lr 作为参数,分别表示要排序的数组部分的起始和结束索引。
  2. 基本情况

    • 如果 l 大于等于 r,则表示当前要排序的数组部分已经是一个元素或为空,不需要排序,直接返回。
  3. 选择基准元素

    • 使用 (l + r >> 1) 计算中间位置的索引,并将该位置的元素 q[l + r >> 1] 作为基准元素 x。这里使用了位运算符 >> 1 来实现整数除以2。
  4. 初始化指针

    • i 初始化为 l - 1j 初始化为 r + 1,这两个指针用于从数组的两端开始遍历。
  5. 分区操作

    • 使用两个 while 循环进行分区:
      • 第一个 while 循环中,i 从左向右遍历,直到找到第一个不小于 x 的元素。
      • 第二个 while 循环中,j 从右向左遍历,直到找到第一个不大于 x 的元素。
    • i 小于 j 时,使用 swap 函数交换 q[i]q[j],将较大的元素移动到数组右侧,较小的元素移动到左侧。
  6. 递归排序

    • 当完成一次分区操作后,对基准元素左边和右边的子数组分别进行快速排序。
  7. 函数调用

    • quick_sort(q, l, j) 对左侧子数组进行排序。
    • quick_sort(q, j + 1, r) 对右侧子数组进行排序。
  8. swap 函数

    • 代码中没有给出 swap 函数的实现,但它应该是一个交换两个整数的函数。
  9. 算法性能

    • 快速排序的平均时间复杂度为 O(n log n),在大多数情况下表现良好。但在最坏情况下(例如,数组已经排序或所有元素相等),时间复杂度会退化为 O(n^2)。
  10. 稳定性

    • 快速排序是不稳定的排序算法,因为相同的元素可能在分区过程中改变它们原来的顺序。

快速排序是一种非常实用的排序算法,由于其高效性,它在实际应用中非常广泛。然而,对于大型数据集或需要稳定性的场景,可能需要考虑其他排序算法,如归并排序。


AC代码

这里小编手懒了,就直接用了高中背过的算法模板,上面有讲解

#include <iostream>
using namespace std;
 
const int N = 1e6 + 10;
int n,q[N];
 
void quick_sort(int q[], int l, int r)
{
    if(l>=r) return;
     
    int x=q[l+r>>1], i=l-1, j=r+1;
     
    while(i<j)
    {
        do i++; while(q[i]<x);
        do j--; while(q[j]>x);
        if(i<j) swap(q[i],q[j]);
    }
     
    quick_sort(q,l,j), quick_sort(q,j+1,r);
}
 
int main()
{
    scanf("%d", &n);
    for(int i=0; i<n; i++)
        scanf("%d", &q[i]);
    quick_sort(q,0,n-1);
    for(int i=0; i<n; i++)
        printf("%d ", q[i]);
         
    return 0;
}

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

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

相关文章

C语言_操作符

目录 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用&#xff0c;函数调用&#xff0c;结构成员 表达式求值 隐式类型转换 算术转换 操作符的属性 练习题 代码仓库 算术操作符 加()&#x…

WAIC上官宣!大模型语料提取工具MinerU正式发布,开源免费“敲”好用

7月4日&#xff0c;2024 WAIC科学前沿全体会议在上海世博中心红厅隆重举行。上海人工智能实验室与商汤科技联合香港中文大学和复旦大学正式发布新一代大语言模型书⽣浦语2.5&#xff08;InternLM2.5&#xff09;&#xff0c;同时全链条工具体系迎来重磅升级&#xff0c;对于大模…

17.【C语言】初识常见关键字 下

1.typedef 类型&#xff08;重新&#xff09;定义&#xff08;或命名&#xff09;&#xff0c;可简化输入 如&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> typedef signed long long k; int main() {k a 0; } signed long long被简写为k这个…

基于SpringBoot的乐校园二手书交易管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言 Java 数据库 MySQL 技术 SpringBoot框架 工具 Visual Studio、MySQL数据库开发工具 系统展示 首页 用户注册界面 二手图书界面 个人中心界面 摘要 乐校园…

vue3+ts+vite项目报错:找不到名称“GC”。ts-plugin(2304)

GC变量通过script标签引入的第三方引入&#xff0c;但是ts-plugin并不知道&#xff0c;需要明确声明这个变量的类型 /// <reference types"vite/client" />declare module "*.vue" {import type { DefineComponent } from "vue";// eslint…

【8】相关补充

【8】相关补充 文章目录 前言一、不同模型在测试集上的精度二、实验记录三、SNP位点筛选及其它python脚本四、总结五、后续安排总结 前言 存放一些有关这个项目研究的补充。 三叶青图像识别研究简概 一、不同模型在测试集上的精度 存放了不同识别模型在测试集上精度评估展示…

2024年前端面试中面试官常拷打的“项目细节”!

前言 都知道前端面试中&#xff0c;面试官最爱拷打的项目细节&#xff0c;根据你的项目经历来进行相关提问&#xff0c;时不时再给你几个高难度问题&#xff0c;让人头疼。 程序员大都有一个特点&#xff1a;会做&#xff0c;不会写&#xff0c;更不会说 前端面试&#xff0c…

【Revit二次开发】创建rvt文件,但不打开Revit

介绍 需要安装Revit&#xff0c;但不用打开Revit加载插件&#xff0c;而是运行一个控制台应用&#xff0c;就可以创建一个rvt文件&#xff08;更多读写功能都可自行添加&#xff09;。 本文内容主要参考&#xff1a;博客1&#xff0c;但对内容进行了简化&#xff0c;只保留了…

第N7周:seq2seq翻译实战-pytorch复现-小白版

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 理论基础 seq2seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种用于机器翻译、文本摘要等序列转换任务的框架。它由两个主要的递归神经网络&#…

BSI 第七届万物互联智慧高峰论坛:主题:拥抱AI时代,标准赋能组织实现可持续发展

BSI 第七届万物互联智慧高峰论坛&#xff1a;主题&#xff1a;拥抱AI时代&#xff0c;标准赋能组织实现可持续发展 主要收到 BSI 温女士的邀请参加的本次论坛。还是学到的很多 。 在科技日新月异的时代背景下&#xff0c;BSI 第七届万物互联智慧高峰论坛于[时间&#xff1a;6…

【HICE】搭建不同的主机名访问web服务

1.首先进入1.conf.d编辑内容&#xff0c;再重启服务&#xff0c;关闭防火墙 2.部署网页haha.html和xixi.html 3.在vim /etc/hosts增加域名 3.在window中进行本地解析的编辑 4.浏览器的验证

阿里云安装rabbitMQ

1、首先看linux 版本 uname -a如果时centos 7 可以参考其他文档。我这里是centos 8 这个很重要 。网上全是按centos7 按照。导致我前面一直安装不上 各种问题。 2、查看rabbitmq 对应 erl 的版本下载 https://www.rabbitmq.com/docs/which-erlang 选择rabbitmq 3.11.19 选择…

【线性代数的本质】矩阵与线性变换

线性变化要满足两点性质&#xff1a; 直线&#xff08;连续的点&#xff09;在变换后还是直线。原点不变。 假设有坐标轴&#xff08;基底&#xff09; i ^ \widehat{i} i 和 j ^ \widehat{j} j ​&#xff1a; i ^ [ 1 0 ] , j ^ [ 0 1 ] \widehat{i}\begin{bmatrix} 1 \…

Facebook广告被拒:常见原因以及避免屏蔽的方法

大多数情况下&#xff0c;广告被屏蔽是因为违反了规则&#xff0c;这不仅仅是因为审核因素。有些规则并不明显&#xff0c;也没有在任何地方指定。例如&#xff0c;在广告中使用广告政策中未列出的停用词&#xff1b;审核算法确定照片描绘的模特过于暴露。下面小编将为你介绍Fa…

四款主流电脑监控软件(电脑监控软件主要优势)

在现代企业环境中&#xff0c;确保员工的工作效率和企业信息的安全成为了管理者的重要任务。电脑监控软件作为一种有效的管理工具&#xff0c;能够帮助企业实现这些目标。固信电脑监控软件在这方面表现尤为出色&#xff0c;本文将详细介绍固信电脑监控软件的优势及其主要功能&a…

【腾讯内推】腾讯2025校招/青云计划/社招——长期有效

及时跟进进度&#xff0c;保证不让简历石沉大海&#xff01; 涵盖NLP/CV/CG/ML/多模态/数据科学/多媒体等各方向! 定向匹配优质团队/竞争力薪酬/覆盖全球工作地点! 招聘对象: 本硕博:2024年1月-2025年12月毕业的同学 目前最热岗位: 技术研究-自然语言处理 技术研究-计算机视觉 …

pdf压缩,pdf压缩在线网页版,在线压缩pdf网站

在数字化时代&#xff0c;pdf文件已经成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;pdf文件往往体积庞大&#xff0c;传输效率低下&#xff0c;还占用大量存储空间。如何在不影响文件质量的前提下&#xff0c;减小pdf文件的大小呢&#xff1f;今天&#xff0c…

【RT-thread studio 下使用STM32F103-学习sem-信号量-初步使用-线程之间控制-基础样例】

【RT-thread studio 下使用STM32F103-学习sem-信号量-初步使用-线程之间控制-基础样例】 1、前言2、环境3、事项了解&#xff08;1&#xff09;了解sem概念-了解官网消息&#xff08;2&#xff09;根据自己理解&#xff0c;设计几个使用方式&#xff08;3&#xff09;不建议运行…

RedHat / CentOS安装FTP服务

本章教程,记录在RedHat / CentOS中安装FTP的具体步骤。FTP默认端口:21 1、安装 epel 源 yum install -y epel-release2、安装 pure-ftpd yum -y install pure-ftpd3、修改默认配置 # 默认配置位于 /etc/pure-ftpd/pure-ftpd.conf,在配置文件中找到下面几个参数进行修改:#…

Vmware环境下ESXi主机 配置上行链路、虚拟交换机、端口组、VMkernel网卡

一、适用场景 1、使用专业服务器跑多种不同的业务&#xff0c;每种业务可能所需运行的server环境不同&#xff0c;有的需要Linux server CentOS7/8、kali、unbuntu……有的需要windows server2008、2003、2016、2019、2022…… 2、本例采用的是VMware ESXi6.7 update 3版本&am…