首页 > 其他分享 >快速排序

快速排序

时间:2024-08-15 14:26:36浏览次数:13  
标签:arr right int pivot 排序 快速 left

quick sort是非常常见的排序

写法也多种多样

核心是每次函数递归/迭代有两个状态, left和right

当left < right的时候才会继续分割, 否则return(left >= right)

pivot的选择一般是随机选择, 也会有人选最左边的, 或者最中间的, 这无所谓

因为范围实际上边界可以取, 所以是[left, right]而言, 对于pivot中间值的选择, 上取整下取整都是可以的

然后就进行一次排序

i和j分别从两侧往中间汇合

i++ 与 j--

这里判断的条件就显得很重要了

int pivot = arr[(left+right)/2];
int i = left;
int r = right;
while(i <= j){
	while(arr[i] < pivot){
		i++;
	}
	while(arr[j] < pivot){
		j--;
	}
	if(i <= j){
		swap[arr[i], arr[j]];
		i++;
		j--;
	}
}

现在有个问题是, 当pivot就是arr[i]或者arr[j]的时候, 一次操作那不就退化成了O(2n)的复杂度?
所以这才是随机选择pivot的意义所在?
我还看到一种写法

int pivot = first;
int i = first;
int j = last;
while(i < j){
	while(arr[i] <= arr[pivot] && i < last){
		i++;
	}
	while(arr[j] > arr[pivot]){
		j--;
	}
	if(i < j){
		swap(arr[i], arr[j]);
	}
}
swap(arr[j], arr[pivot]);

就这种写法而言, arr[pivot]是不需要经常swap的, 只有O(n)的复杂度
当然这里为了照顾边界条件的原因, 多走了一次i<last的判断
仁者见仁智者见智
个人觉得代码自己认为清晰易懂就是极好的

标签:arr,right,int,pivot,排序,快速,left
From: https://www.cnblogs.com/ryougi/p/18360848

相关文章

  • 使用kimi快速完成论文仿写的提示词,我帮你总结好了
    学境思源,一键生成论文初稿:AcademicIdeas-学境思源AI论文写作在完成论文写作时,很多人都会想到“仿写”,但正确的做法是借鉴而非复制。今天我们将分享如何利用Kimi智能助手来提高论文写作的效率和质量,同时确保原创性和学术诚信。通过Kimi的帮助,可以更快地完成论文写作,同时保......
  • 【Python快速入门和实践011】Python常用脚本-目标检测之VOC格式转YOLO格式脚本
    一、数据集介绍        NEU-DET数据集是由东北大学(NortheasternUniversity,简称NEU)发布的一个用于钢材表面缺陷检测的数据集。这个数据集特别设计用于支持和促进工业领域中的缺陷检测研究。NEU-DET数据集的一些主要特点包括:多样性和复杂性:数据集包含了多种类型......
  • 短剧CPS系统搭建全攻略:从零到一,详细教程助你快速上手
    目录一、短剧cps是什么?二、短剧cps系统搭建教程1.前端开发2.后端开发4.自动化与持续集成5.数据分析与监控三、部分代码展示 一、短剧cps是什么?短剧CPS系统是一种基于短剧推广的收益分成平台。该系统集成了短剧内容展示、用户观看、付费购买、佣金分成等功能,......
  • ABAP 7.40 快速参考-内联声明
     7.40之前7.40数据DATAtextTYPEstring.text='ABC'.DATA(text)='ABC'.循环进入工作区DATAwalikeLINEOFitab.LOOPATitabINTOwa....ENDLOOP.LOOPATitabINTODATA(wa)....ENDLOOP.调用方法DATAa1TYPE...D......
  • 我的点赞功能(完整分页查询步骤)和快速刷题开发
    文章目录1.我的点赞分页展示1.分页查询工具类1.PageInfo.java需要分页查询的就继承它,传值的时候pageNo和pageSize可以为空2.PageResult.java根据条件从数据库中查询信息,然后设置这里的四个值即可得到分页查询结果2.sun-club-application-controller1.SubjectLikedDTO.......
  • .NET 7 + Vue 权限管理系统 小白快速上手
    前言今天给大家推荐一个超实用的开源项目《.NET7+Vue权限管理系统小白快速上手》,DncZeus的愿景就是做一个.NET领域小白也能上手的简易、通用的后台权限管理模板系统基础框架。不管你是技术小白还是技术大佬或者是不懂前端Vue的新手,这个项目可以快速上手让我们从0到1,搭建......
  • 四款录屏大师,一键搞定!新手也能快速上手?
    现在随着新媒体的记录设备的不断更新迭代之下,我们记录生活的工具也愈来愈强大,不过如果需要记录电脑中的重要信息时,我们就需要借助录屏工具来实现了,所以今天整理了四款实用靠谱的录屏大师,有需要的朋友可以试试:第一款:foxit录屏工具地址(粘贴到浏览器打开):www.foxitsoftware.cn/RE......
  • 2024华为OD机试真题-启动多任务排序(C++/Python)-C卷D卷-200分
    2024华为OD机试题库目录(Python、C++)-(C卷+D卷)-CSDN博客目录题目描述输入描述输出描述用例1题目解析代码c++python题目描述一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。......
  • 冒泡排序算法
    C++实现冒泡排序算法:#include<iostream>usingnamespacestd;voidbubbleSort(intarr[],intn){for(inti=0;i<n-1;i++){for(intj=0;j<n-i-1;j++){if(arr[j]>arr[j+1]){//交换arr[j]和arr[j+1]inttemp=arr[j];arr[j]=arr[j+1];......
  • SQL 变量写法、排序问题 <12>
    一、定义变量排序目的1:合并学生表和分数表,将每个班分别排名目的2:遇到相同分数,考虑还是不考虑相同分数排名学生表(1000条)和分数表(6000条)分别如下1、定义变量、简答排序首先先看一段简单代码:set@i:=0;--定义一个变量i,初始化值为1SELECT *--查询所有的学生表信息......