DS排序--快速排序

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 4441 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是刚才上面的tempint 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.hqwc.cn/news/285301.html

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

相关文章

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

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

人工智能辅助下的人工心脏:未来医疗的奇迹

导言 人工智能在医学领域的应用不断创新&#xff0c;其中人工心脏作为医疗工程的重要方向&#xff0c;将为心血管疾病患者带来新的治疗可能性。本文将深入研究人工智能辅助下的人工心脏技术&#xff0c;其原理、应用以及对未来医疗的影响&#xff0c;探讨人工心脏的发展历程、面…

apache shiro 反序列化漏洞解决方案

apache shiro 反序列化漏洞解决方案 反序列化漏洞解决方案产生原因解决方案1&#xff1a;1.升级shiro至最新版本1.7.1解决方案2&#xff1a;修改rememberMe默认密钥&#xff0c;生成随机密钥。 反序列化漏洞解决方案 反序列化漏洞介绍 序列化&#xff1a;把对象转换为字符串或…

unittest自动化测试框架讲解以及实战

为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;通常指函数或者类&#xff0c;一般是开发完成的。 单元…

详细教程 - 从零开发 鸿蒙harmonyOS应用 第九节-——鸿蒙操作系统中的自定义视图封装:一次奇妙的旅程

一、简介 自定义视图是开发鸿蒙应用时的一个重要功能。在这篇文章中&#xff0c;我们将详细探讨如何在鸿蒙系统中实现自定义视图的封装&#xff0c;并提供一些代码示例作为你的地图。 二、自定义视图的实现 在鸿蒙操作系统中&#xff0c;我们可以通过继承ohos.agp.components.…

深入解析Guava范围类(Range)

第1章&#xff1a;范围类Range的重要性 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊一个在Java编程世界里非常实用但又被低估的角色——Guava库中的Range类。你知道吗&#xff0c;在处理涉及到数值范围的问题时&#xff0c;Range类就像是咱们的救星。不论是判断某个数…

阿里云主导《Serverless 计算安全指南》国际标准正式立项!

日前&#xff0c;在韩国召开的国际电信联盟电信标准分局 ITU-T SG17 全会上&#xff0c;由阿里云主导的《Serverless 计算安全指南》国际标准正式立项成功。 图 1 项目信息 在现今数字化时代&#xff0c;Serverless 计算正逐渐成为云计算的一个新的发展方向&#xff0c;其灵活…

Spring Boot自动装配原理以及实践

了解自动装配两个核心 Import注解的作用 Import说Spring框架经常会看到的注解&#xff0c;它有以下几个作用: 导入Configuration类下所有的bean方法中创建的bean。导入import指定的bean&#xff0c;例如Import(AService.class)&#xff0c;就会生成AService的bean&#xff0…

【map】【单调栈 】LeetCode768: 最多能完成排序的块 II

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 涉及知识点 单调栈 排序 map 区间合并 题目 给你一个整数数组 arr 。 将 arr 分割成若干 块 &#xff0c;并将这些块分别进行排序。之后再连接起来&#xff0c;使得连接的结果和按升序排序后的原数组相同。 返回…

SpringBoot已经禁掉了循环依赖!

还在问循环依赖嘛&#xff1f;SpringBoot已经禁掉了循环依赖&#xff01; 首发2023-12-18 11:26yuan人生 如果现在面试时还有人问你循环依赖&#xff0c;你就这样怼他&#xff1a;循环依赖是一种代码质量低下的表现&#xff0c;springboot2.6之后的版本已经默认禁用了。 Spr…

Postman使用总结--参数化

将 测试数据&#xff0c;组织到 数据文件中&#xff0c;通过脚本的反复迭代&#xff0c;使用不同的数据&#xff0c;达到测试不同用例的目标 数据文件有两种&#xff1a; CSV &#xff08;类似于excel&#xff09; 格式简单用这个 文件小 JSON&#xff08;字典列表&#x…

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

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