DS排序--快速排序

news2024/11/25 14:48:30

Description

给出一个数据序列,使用快速排序算法进行从小到大的排序

排序方式:以区间第一个数字为枢轴记录

输出方式:每一步区间排序,都输出整个数组

–程序要求–

  • 若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
  • 程序中若include多过一个头文件,不看代码,作0分处理
  • 不允许使用第三方对象或函数实现本题的要求

Input

第一行输入t,表示有t个测试示例

第二行输入n,表示第一个示例有n个数据

第三行输入n个数据,都是正整数,数据之间用空格隔开

以此类推

Output

每组测试数据,输出每趟快排的结果,即每次排好一个数字结果(长度为1的子序列,不用排,不用输出)。不同测试数据间用空行分隔。

Sample

#0
Input

Copy

2
6
111 22 6 444 333 55
8
77 555 33 1 444 77 666 2222
Output

Copy

55 22 6 111 333 444
6 22 55 111 333 444
6 22 55 111 333 444
6 22 55 111 333 444

1 33 77 555 444 77 666 2222
1 33 77 555 444 77 666 2222
1 33 77 77 444 555 666 2222
1 33 77 77 444 555 666 2222
1 33 77 77 444 555 666 2222

本题用的快速排序,而且还是折半快速排序

快速排序原理:

基本思想:

        采用“分治”的思想,对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素,通过第一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边,再有同样的方法递归排序这两部分,直到序列中所有数据均有序为止。

大家一定要记得快速排序不稳定哈。
什么叫不稳定?
就是比如1 2 2 3,这里的两个2其实有先后之分的,如果我们的算法会导致第一个2跟第二个2交换位置,这个就是不稳定。
快速排序为什么不稳定?
从之后我给你们跑的样例就可以看出来,快速排序他交换位置的时候跨过了很多别的数,所以相等的数原本在后面的可能跑到前面去了

快速排序的实现:

如果是sztu的可以学一下郭老师教的这个版本,我会一步一步按照样例给你们跑出来结果演示一遍

样例:111 22 6 444 333 55

这个是要排序的数组

用两个指针 left 和 right 还有一个temp存临时值

开始让数组dp[0]的值为temp值,然后相比较temp值在左边,所以我们从右边right开始往左走找小于temp的值

找到小于temp的55然后交换

然后temp值在右边,然后left从左向右找大于temp的值


tips:temp在左,right从右往左找小于temp的值。temp在右,left从左往右找大于temp的值

找到444大于temp值然后交换位置

然后temp在做,right找比temp小的,没找到,然后left=right,结束循环

这里还没完成!!!

这其实之后进行递归,将此时left为准左右两边分块分别重复上面的步骤,然后就可以排好序了。右边大家都看出来已经排好了,我就不画图了,但是实际上代码还是把右边的跑了一遍的

分块成这样:

然后重复步骤temp为最左边那个,然后right找<temp的值,然后找到6交换位置

这里其实都已经排序好了,但是递归会递归到每组只有一个元素的时候。剩下的我就不画了

快速排序实现代码细节:

tips:上面的temp参数代码里用的是center,还有上面移动的 leftll rightrr 。这样写的原因是底下递归的时候,需要用到传入的leftright,所以最好不要改变他们

本题思路:

enmmmm,还有什么好说的,已经说了是快速排序算法了!

tips:记住这张图(图来源郭老师)

空间复杂度为什么是log_2 n,因为你每次分割递归的时候平均相当于折半开了空间,然后每次都给你折半了。

本题实现代码:

#include <iostream>
using namespace std;
const int maxn = 1e5 + 10;
int n;
int dp[maxn];
void output()
{
    for (int i = 0; i < n; i++)
    {
        cout << dp[i] << " ";
    }
    cout << endl;
}
void quicksort(int left, int right)//这里是左闭右开的写法
{
    if (left >= right - 1)//如果left >= right - 1递归就结束返回
        return;
    int center = dp[left];//center是刚才上面的temp
    int ll = left, rr = right - 1;//ll和rr是刚才上面跑的left和right指针
    while (ll < rr)               //为什么要取一个新的原因是递归需要输入边界,所以最开始用的left和right最好不要改
    {
        while (ll < rr && center <= dp[rr])//center就是temp在左边,右指针rr往左找比center小的数
            rr--;
        swap(dp[ll], dp[rr]);//找到了然后交换
        while (ll < rr && dp[ll] <= center)//这个时候center在右边,所以left指针向右找比center大的数
            ll++;
        swap(dp[ll], dp[rr]);//然后交换
    }
    output();//本题要输出每次排序一次的结果
    quicksort(left, ll);//然后以ll为界限,左右两边分块递归
    quicksort(ll + 1, right);
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            cin >> dp[i];//输入要排序的数组
        }
        quicksort(0, n);//调用快速排序
        cout << endl;
    }
    return 0;
}


       我也不知道自己写清楚没,这个方法跟网上一些的区别是我们center取的是第一个数,但是网上的好像折半取,就是取中间那里的,但是实质上没有区别,因为center值在那次函数实现中没有改变过 

期末月了,好多事情啊,感觉更不下去了。

祝我别挂科吧。概率论真的慌!!!
概率论竟然还有大作业,好想哭

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

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

相关文章

深度学习笔记_7经典网络模型LSTM解决FashionMNIST分类问题

1、 调用模型库&#xff0c;定义参数&#xff0c;做数据预处理 import numpy as np import torch from torchvision.datasets import FashionMNIST import torchvision.transforms as transforms from torch.utils.data import DataLoader import torch.nn.functional as F im…

2000年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

今天是2023年12月19日&#xff0c;距离2024年的AMC8正式考试倒计时一个月。 从战争中学习战争最有效。前几天&#xff0c;六分成长分析了2023年、2022年、2020、2019、2018、2017的AMC8真题的典型考题、考点和详细答案解析。 今天我们不再从2016年分析&#xff0c;来看看更早…

pytorch文本分类(三)模型框架(DNNtextCNN)

pytorch文本分类&#xff08;三&#xff09;模型框架&#xff08;DNN&textCNN&#xff09; 原任务链接 目录 pytorch文本分类&#xff08;三&#xff09;模型框架&#xff08;DNN&textCNN&#xff09;1. 背景知识深度学习 2. DNN2.1 从感知器到神经网络2.2 DNN的基本…

避坑指南:uni-forms表单在uni-app中的实践经验

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;uni-app篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:uni-app中forms表单的避坑指南篇 该篇章已被前端圈子收录,点此处进入即可查看更多优质内…

Pytorch nn.Linear()的基本用法与原理详解及全连接层简介

主要引用参考&#xff1a; https://blog.csdn.net/zhaohongfei_358/article/details/122797190 https://blog.csdn.net/weixin_43135178/article/details/118735850 nn.Linear的基本定义 nn.Linear定义一个神经网络的线性层&#xff0c;方法签名如下&#xff1a; torch.nn.Li…

AT32F403如何扩大SRAM

配置方法 使用雅特力的ICP 进行配置(可在官网下载) (1)当连接上芯片后,点击设备操作->选择字节 (2)选择224KB SRAM (3)然后点击应用到设备,(可以点击从设备加载,来看当前的配置) (4)打开keil5魔术棒图标 ,将Target中的IRAM1第二个选项从0x10000改为0x3800。…

虚拟电厂 能源物联新方向

今年有多热&#xff1f;据上海市气象局官微消息&#xff0c;5月29日13时09分&#xff0c;徐家汇站气温达36.1℃&#xff0c;打破了百年来的当地5月份气温*高纪录。不仅如此&#xff0c;北京、四川、江西、湖南、广东、广西等地也频频发布高温预警。 伴随着居民用电急剧攀升&am…

4.1 媒资管理模块 - Nacos与Gateway搭建

文章目录 媒资管理模块 - 媒资项目搭建一、需求分析1.1 介绍1.2 数据模型1.3 分析网关 二、 搭建Nacos2.1 服务发现中心2.2.1 Maven2.2.2 配置Nacos 2.2 配置中心2.2.1 介绍2.2.2 Maven 坐标2.2.3 配置 content-api 工程2.2.4 配置 content-service 工程2.2.5 配置 system-api …

基础算法(5):滑动窗口

1.何为滑动窗口&#xff1f; 滑动窗口其实也是一种算法&#xff0c;主要有两类&#xff1a;一类是固定窗口&#xff0c;一类是可变窗口。固定的窗口只需要一个变量记录&#xff0c;而可变窗口需要两个变量。 2.固定窗口 就像上面这个图一样。两个相邻的长度为4的红色窗口&…

HTML---CSS美化网页元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.div 标签&#xff1a; <div>是HTML中的一个常用标签&#xff0c;用于定义HTML文档中的一个区块&#xff08;或一个容器&#xff09;。它可以包含其他HTML元素&#xff0c;如文本、图像…

探秘 AJAX:让网页变得更智能的异步技术(上)

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

如何编写好的测试用例?

对于软件测试工程师来说&#xff0c;设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在这篇文章中&#xff0c;我们将介绍测试用例设计常用的几种方法&#xff0c;以及如何编写高效的测试用例。 一、…

iPhone 17Pro/Max或升级4800万像素长焦镜头,配备自研Wi-Fi 7芯片。

iPhone 16未至&#xff0c;关于iPhone 17系列的相关消息就已经放出&#xff0c;到底是谁走漏了风声。 海通国际证券技术分析师Jeff Pu近日发布报告称&#xff0c;苹果将为2025年推出的iPhone 17ProMax配备4800万像素的长焦镜头。经调查&#xff0c;该分析师认为提升iPhone拍摄方…

如何在华为云上购买ECS及以镜像的方式部署华为云欧拉操作系统 (HCE OS)

写在前面 工作中遇到&#xff0c;简单整理博文内容为 华为云开发者认证 实验笔记https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在…

Nginx快速入门:Nginx应用场景、安装与部署(一)

1. Nginx简介 Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;也是一个非常流行的开源 Web 服务器软件。它是由俄罗斯程序员 Igor Sysoev 开发的&#xff0c;最初是为了解决在高并发场景下的C10k 问题&#xff08;即一个服务器进程只能处理 10,000 个并发连接&#x…

早期的OCR是怎么识别图片上的文字的?

现在的OCR技术融合了人工智能技术&#xff0c;通过深度学习&#xff0c;无论是识别的准确率还是效果都非常不错&#xff0c;那您知道在早期的OCR是通过什么技术来实现的吗&#xff1f;如果您不知道&#xff0c;那么&#xff0c;就让我来告诉您&#xff1a;它主要是基于字符的几…

DiffUtil + RecyclerView 在 Kotlin中的使用

很惭愧, 做了多年的Android开发还没有使用过DiffUtil这样解放双手的工具。 文章目录 1 DiffUtil 用来解决什么问题?2 DiffUtil 是什么?3 DiffUtil的使用4 参考文章 1 DiffUtil 用来解决什么问题? 先举几个实际开发中的例子帮助我们感受下: 加载内容流时,第一次加载了ABC,…

数据分析思维导图

参考&#xff1a; https://zhuanlan.zhihu.com/p/567761684?utm_id0 1、数据分析步骤地图 2、数据分析基础知识地图 3、数据分析技术知识地图 4、数据分析业务流程 5、数据分析师能力体系 6、数据分析思路体系 7、电商数据分析核心主题 8、数据科学技能书知识地图 9、数据挖掘…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于碳捕集-电转气的矿区综合能源系统协同优化调度》

这个标题涉及到碳捕集、电力转化为气体&#xff08;可能是指电力转化为氢气等&#xff09;、矿区综合能源系统以及协同优化调度等概念。让我们逐步解读&#xff1a; 碳捕集&#xff08;Carbon Capture&#xff09;&#xff1a; 这指的是通过不同技术手段捕获和隔离工业过程中产…

输电线路定位:精确导航,确保电力传输安全

在现代社会中&#xff0c;电力作为生活的基石&#xff0c;其安全稳定运行至关重要。而输电线路作为电力传输的重要通道&#xff0c;其故障定位和修复显得尤为重要。恒峰智慧科技将为您介绍一种采用分布式行波测量技术的输电线路定位方法&#xff0c;以提高故障定位精度&#xf…