快速排序-超级详细代码注释!
Description
给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使用STL。
Input
输入数据第一行给出正整数N(≤10^5),随后给出N个整数,数字间以空格分隔。
Output
输出排序后的结果,数字间以一个空格间隔,行末不得有多余空格。
Sample
Input
8
49 38 65 97 76 13 27 49
Output
13 27 38 49 49 65 76 97
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <math.h>
using namespace std;
int a[100001];
void qst(int a[],int l,int r)
{//key随便定义吗?//答:定义一个变量,规定第一个值为标杆值,当然此值一般可以随便选择。int key=a[l];//为什么用i和j?//答:来确定新的右边界和左边界,传进来的l和r是下次递归调用的左边界,和右边界,所以不能直接用l,和r参与循环。(可以看最后递归的两句)。int i=l,j=r;//为什么边界是l>r?//l,和r是对本次递归来说的,传进来的参数是l和r,传进来的相等就代表已经不可再分一半递归了。if(l>=r){return;}//外层大循环什么意思?//利用i和j,来确定此次循环从左边i开始进行i++,和右边j同时开始j--,保证最后全部移动完毕while(i<j){//下面第一个小循环的作用?//这个循环是让满足条件的快速移动过去-//例如 key=3//序列是3,2,3,1,4,5,2,4,j指向4的时候会满足while,j--,这时候j指向2不满足while,跳出循环。//循环的是哪几句?//答:循环的 { j--;}仅仅这一句,只要满足a[j]>=key,就说明右边的这个值,是大于标杆的,已经在右边了,不用把他移动。//为什么还要保证i<j?//答:因为右边的j如果一直j--,会出错的,所以同时保证i<jwhile(i<j&&a[j]>=key){ j--;}//为什么是 a[i]=a[j],不是a[j]=a[i]?//当上面的循环不满足时,代表需要移动,把a[i]=a[j],不会造成覆盖问题丢失被赋值的数,因为a[i]已经被key保存下来,循环结束,会把key放到i==j的中间位置。a[i]=a[j];while(i<j&&a[i]<=key)//同上i++;a[j]=a[i];}a[i]=key;//中间位置是没有值的,把key值放到中间,标杆就到了中间?qst(a,l,i-1);//连续递归调用函数,左边界为传进来的,右边界是我们用i,j刚确定的。qst(a,i+1,r);
}
int main()
{int n;cin>>n;for(int i=1; i<=n; i++){scanf("%d",&a[i]);}qst(a,1,n);for(int i=1; i<=n; i++){printf("%d ",a[i]);}return 0;
}
去注释版
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <math.h>
using namespace std;
int a[100001];
void qst(int a[],int l,int r)
{int key=a[l];int i=l,j=r;if(l>=r){return;}while(i<j){while(i<j&&a[j]>=key){ j--;}a[i]=a[j];while(i<j&&a[i]<=key)//同上i++;a[j]=a[i];}a[i]=key;qst(a,l,i-1);qst(a,i+1,r);
}
int main()
{int n;cin>>n;for(int i=1; i<=n; i++){scanf("%d",&a[i]);}qst(a,1,n);for(int i=1; i<=n; i++){printf("%d ",a[i]);}return 0;
}
快速排序-超级详细代码注释!相关推荐
- uniapp - 通讯聊天功能示例源代码,类似微信聊天 / 电商淘宝京东 “买卖双方“ 消息沟通系统 / 各大应用简易聊天沟通的功能插件(超级详细代码和注释,开箱即用)全端兼容 H5 App 小程序
前言 网上的教程鱼龙混杂太乱了,并且全都是各种引入关系.各种冗余代码,拿过来后根本无法进行改造. 本文实现了 uniapp 全平台兼容的 "1对1 即时聊天沟通" 的聊天窗口模板, ...
- (信贷风控九)行为评分卡模型python实现(详细代码+注释+讲解)
(九)行为评分卡模型python实现(详细代码+注释+讲解) 浅谈行为评分卡 我们知道行为评分卡只要用在信贷的贷中环节,贷中指的是贷款发放之后到期之前的时间段,其实行为评分卡和申请评分卡在实现上没有太 ...
- 详细代码注释1148: 组合三位数之一
题目描述 48: 组合三位数之一 时间限制: 1 Sec 内存限制: 128 MB 提交: 5197 解决: 3705 把1.2.3.4.5.6.7.8.9组合成3个3位数,要求每个数字仅使用一次,使 ...
- 【算法】基于hoare快速排序的三种思想和非递归,基准值选取优化【快速排序的深度剖析-超级详细的注释和解释】你真的完全学会快速排序了吗?
文章目录 前言 什么是快速排序 快速排序的递归实现 快速排序的非递归实现 单趟排序详解 hoare思想 挖坑法 前后指针法 快速排序的优化 三数取中 小区间优化 快速排序整体代码 尾声 前言 先赞后看 ...
- 中正则表达式详解_python :正则表达式/re库 超级详细de注释解释
首先要解释,什么是正则表达式: 给定一串字符串,我们可以提取他的特征,把他抽象成一个类型. 下次遇到和这个字符串同类的字符串,我们只需要判断是否符合特征,就知道这个字符串是不是同类的. 举个例子: 每 ...
- 超级详细的注释C语言简单实现童年小游戏:贪吃蛇
引言: 记得小时候还没有现在超级高端的智能手机,当时的诺基亚类型的老人机是我的最爱,而里面的贪吃蛇小游戏我总是能玩很久,所以今天就用C语言简单实现一下贪吃蛇这一个小游戏吧. 一. 准备工作: 1.VS ...
- Vue - 实现垂直菜单分类栏目,鼠标移入后右侧出现悬浮二级菜单容器效果(完整示例源码,详细代码注释,一键复制开箱即用)
前言 网上的教程都太乱了,各种杂乱无注释代码.图片资源丢失.一堆样式代码,根本无法改造后应用到自己的项目中. 本文实现了 在 Vue / Nuxt 项目中,垂直分类菜单项,当用户鼠标移入菜单后,右侧自 ...
- YOLOv5 史上最详细代码注释 逐行注释 0基础搞懂
最近将yolov5源码进行解析,为了便于小白进行学习,将源码逐行进行注释,最详细说明.结合注释案例,进一步理解. 源码地址示例来自官方源码: """ Train a YO ...
- tensorflow 最小二乘拟合详细代码注释
#程序 不是我写的,注释是我做的,转载请注明"lg土木设计"#最小二乘法拟合,用y=ax+b a=weight b=biases from __future__ import pr ...
最新文章
- 数据结构与算法常用名词术语整理
- python制作验证码_Python编写生成验证码的脚本的教程
- java 字符串用法_java中字符串的用法
- 基于IFC的大型三维城市群体——智慧城市模拟
- Redis发布订阅和Stream
- 力扣401.二进制手表
- hibernate 查询id为空懒加载_hibernate 查询时指定查询字段、级联表的一种方式
- Oracle 10g Create Database
- 学习数据库系统概念,设计及应用心得
- 抛砖引玉——Stagefright漏洞初探
- mac本更新chromedriver版本
- linux系统用户和普通用户,适合普通Linux用户的五大Linux发行版
- 文件储存树的理解(ISAM 和 B+Tree)
- 趣图:谁说理工男都穿格子衫?
- FL Studio21汉化中文版下载及安装方法FL专业音乐制作软件
- 解决火车头采集器无法采集HTTPS的办法
- 防止开发人员开发后门程序,数据库安全之应用程序调用的危险
- 开源应用程序打包工具
- PND Solution(Design House) (China)
- AUR 打包自己的软件