快速排序的枢轴(pivot)和边界

【数据结构排序算法篇】----快速排序【实战演练】 学习快速排序,最重要的就是学会分治思想,对于pivot的选择有很多种,这让我们产生了如何使用更加合适的pivot时代码变得更加高效,下面我们就开始谈谈快速排序。快速排序是一个高效的排序算法,由C.A.R. Hoare在1960年提出。因其平均时间复杂度为O(n log n)而被广泛使用,并且还具有原地排序(不需要额外大量的内存空间)的优点。这种算法的基本思想是分治策略,通过一个称为"pivot"(中枢或枢轴)的元素来将原数组分割成两个子数组。选择pivot(枢轴元素)从数组中选择一个元素作为pivot。 阅读详情

最近在看算法导论中的快速排序的算法,

算法的基本思想是选择数组中的一个元素x作为枢轴,然后与数组中的其它元素进行比较,

通过一趟排序使枢轴左边比x小,枢轴右边比x大,然后再递归的进行下去。

lz想,既然随便选一个元素当枢轴,就抱着试验的心理将枢轴从a[r]改为a[p]。但是结果不对。

再回头仔细看一下算法,发现当用不同的元素作为枢轴的时候,相应的边界条件要做出改变。

下面分别给出以 a[p]和a[r]作为枢轴时的代码,做个对照。下一步实现随机快速排序,请高手指教
 

以a[p]为枢轴时:

#include<iostream>
using namespace std;

int partition(int a[],int p,int r)
{
	int x = a[p];
	int i =r+1,j=0;
	int tmp = 0;
	for(j= r; j >=p+1;j--)
	{
		if(a[j] >= x)
		{
			i--;
			tmp = a[i];
			a[i] = a[j];
			a[j] = tmp;
		}
	}
	tmp = a[p];
	a[p] = a[i-1];
	a[i-1] = tmp;
	return i-1;
}
void quickSort(int a[],int p,int r)
{
	if(p < r)
	{
		int q = partition(a,p,r);
		quickSort(a,p,q-1);
		quickSort(a,q+1,r);
	}
}
int main()
{
	int a[10]={20,-2,1,9,5,21,46,30,96,17};
	quickSort(a,0,9);
	for(int i = 0;i <10;++i)
		cout<<a[i]<<endl;
	return 0;
}


 

以a[r]作为枢轴时:

#include<iostream>
using namespace std;

int partition(int a[],int p,int r)
{
	int x = a[r];
	int i =p-1,j=0;
	int tmp = 0;
	for(j= p; j <=r-1;j++)
	{
		if(a[j] <= x)
		{
			i++;
			tmp = a[i];
			a[i] = a[j];
			a[j] = tmp;
		}
	}
	tmp = a[r];
	a[r] = a[i+1];
	a[i+1] = tmp;
	return i+1;
}
void quickSort(int a[],int p,int r)
{
	if(p < r)
	{
		int q = partition(a,p,r);
		quickSort(a,p,q-1);
		quickSort(a,q+1,r);
	}
}
int main()
{
	int a[10]={20,-2,1,9,5,21,46,30,96,17};
	quickSort(a,0,9);
	for(int i = 0;i <10;++i)
		cout<<a[i]<<endl;
	return 0;
}



 

快速排序-改进的枢轴元素-三者取中算法比较 输入若干组长度各异的待排序列,分别用快速排序算法和改进的枢轴元素三者取中算法对待排序列进行排序,当待排子序列长度已小于 20时,改用直接插入排序,利用时间函数验证三者取中算法在效率上的提高。(提示: 待排序列的长度一般应为 10000 以上) 立即下载

相关推荐

安鸾渗透测试平台-CTF系列-bash

工具Xshell 公网VPS接收反弹shell Xshell新手的下载及安装教程(超详细)_新手程序员攀爬之路的博客-优快云博客_xshell使用教程 Xshell连接后 #!/bin/bash cat ${0} while : do echo "$" read input output=`$input` 显示了一个文件,不过咋做呢?这里可能考察的是linux的语法 方法 输入bash 获得shell cat ${0} while : do .

AAAAAAAAAAAA66的博客 2689

快速排序的优化——枢轴数的选择

引用严蔚敏的《数据结构》的话,在所有数量级都为nlgn的排序方法中,快排的常数因子k最小。这意味着快排是目前被认为是最好的一种内部排序方法。 下面先放出快排的代码: void QuickSort(int *a,int low,int high){ if(low<high){ int l = low,h = high,flag = a[low...

jerry的博客 5215

康耐视 VisionPro CogImageFileTool(将获得的图像保存至文件或从文件中获取图像)工具

VisionPro CogImageFileTool(将获得的图像保存至文件或从文件中获取图像)工具

zhihuishuxia__的博客 2064

快速排序详解

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。快速排序的关键是枢轴量的选取,其原理是选择一个枢轴量对记录进行比较,使小于枢轴量的调整到数组的左边,大于枢轴量的调整到数组的右边。即该方法的基本思想可描述为:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边...

止语的博客 761

STM32F103C8T6全桥逆变电路PWM波生成(基于HAL库)

全桥逆变电路需要两组开关管相互协同工作,故需要两路PWM控制信号,为了防止电源短路,需要保证同一桥臂的上下两个开关管不会同时导通,故两路PWM在相位上需要相差180°;为了保证高频变压器不会磁饱和,使正负半周PWM占空比相同。但是传统的互补输出达不到调节占空比调节输出电压的效果。......

weixin_45042735的博客 6025

163种中草药图像数据集构建与ResNet-50迁移学习实战指南

在计算机视觉领域,高质量标注数据集是模型训练的基石,直接影响图像分类、目标检测等任务的性能。其核心原理在于为算法提供结构化的监督信号,通过深度学习模型学习从像素到语义的映射关系。构建此类数据集的技术价值在于解决了特定垂直领域(如中医药)数据稀缺的痛点,为AI技术落地提供了关键“燃料”。在应用场景上,标准化数据集广泛支撑着教学演示、算法验证和产业应用开发。本文聚焦于中草药识别这一细分领域,详细介绍了一个包含163种常见药材、经过多源聚合与清洗的图像数据集构建全过程,并提供了基于PyTorch和ResNet-5

weixin_33672400的博客 455

排序算法之快速排序 分类: C/C++ 数据结构与算...

快速排序将以枢轴为界,将原数组分为两个部分,枢轴以前,值都小于枢轴的值,枢轴以后的值都大于枢轴。 采用递归的方法,对以枢轴为界的两个子序列进行快速排序,直至子序列长度为1。 1、快速排序的关键是枢轴的选取,主要有三种方法:1)选取第一个或最后一个作为枢轴值;2)采用随机数生成器,生成枢轴值的下标;3)取第一个、最后一个、中间三者的中间值作为枢...

weixin_30872157的博客 258

Android应用之【巧妙隐藏桌面图标的进阶方案】

本文详细探讨了Android应用中隐藏桌面图标的进阶方案,解决了传统方法在Android 10及以上版本中出现的黑色图标残留问题。通过Intent-Filter配置和厂商适配技巧,实现子应用真正隐身,同时确保主应用正常启动。适用于企业工具套件、模块化系统等场景,提升用户体验和安全性。

weixin_28363123的博客 508

算法导论(快速排序)

1.pivot为数组的最后一个数。 2.使用一个for循环就能完成partition部分。 package algorithm.sort; import java.util.Arrays; public class Quicksort { public static void main(String[] args) { int[] arr = {-9,78,0,23,-587,70}; QUICKSORT(arr, 0, arr.length-1);

weixin_54374320的博客 179

破译丰田BEAN总线之谜

我对CAN的深入了解并不是从CAN本身开始的,而是起源于丰田公司自主研发的BEAN总线。由于BEAN总线协议并不是公开的,而是一种技术机密,所以当丰田车不在使用BEAN总线两年多后的今天,虽然这里还不敢公开技术细节,但回想起当年的作品,随便写写也算对自己的努力有所交代。   南方都市报惠州版曾经报道过一则新闻,说的是丰田皇冠车被盗率非常高。其实两年前就已经知道了皇冠车的防盗系数很低,所以当时的首

粤嵌 5264

深度学习Halcon中GPU显存利用率高,但GPU、CPU利用率较低,导致模型训练速度很慢,通过设置硬件参数的解决方法

深度学习Halcon中GPU显存利用率高,但GPU、CPU利用率较低,导致模型训练速度很慢,通过设置硬件参数的解决方法 前言 在训练自己模型的时候,会遇到GPU显存利用率高,但GPU、CPU利用率较低,导致模型训练速度很慢的问题。这个问题一方面是由于硬件没有设置到最佳工作状态,另一方面是代码中参数没有设置好。最近在跑Halcon DL遇到这个问题,而Halcon不像开源的几个框架那样自由,代码封装的比较多。所以遇到这种问题,只能在参数最优的情况下,通过设置硬件参数来提升性能。 当然,在跑DL之前,无论什么框

ZiLiangQin的博客 9915

内部排序(五)快速排序(上)- 概述与选择枢轴

快速排序终于要来了,快速排序也是交换排序的一种,其实讲快速排序前应该先讲讲冒泡排序,因为快速排序是对冒泡排序的一种改进,那就先来用最快速度复习一下冒泡排序: 冒泡排序:假设要对待排序了做升序排序,那么首先从待排序列第一个元素开始,和第二个元素作比较,如果第一个元素大于第二个元素,就把它们的位置交换,接着再对序列第二个元素和第三个元素作比较,如果第二个元素比第三个元素大,就交换位置,一直重复直到长...

大力海棠的博客 4691

【AI大模型应用开发】3.2 RAG实战 - RAG应用+UI实现加载本地文件并对话

前面我们实现了RAG基本流程,今天我们在此基础上给它加个UI界面,在浏览器打开,实现上传本地文件、解析,并用大模型实现与该文档的对话。也就是一个阉割版demo版的ChatPDF或知识库对话系统。

同学小张的博客 3055

C++ (Implement Quicksort with first element as pivot)以第一个元素为枢轴元素实现快速排序

快速排序是一种分治算法。它选择一个元素作为枢轴,并围绕该枢轴对给定数组进行分区。快速排序有很多不同的版本,它们选择枢轴的方式各不相同。 始终选择第一个元素作为枢轴。始终选择最后一个元素作为枢轴点。随机选择一个元素作为枢轴。选择中位数作为枢轴点。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 5613

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

PAT甲级1101、Quick Sort

这个题目一看上去就有动态规划的意思,用数组记录一个元素前的某种信息,以此来达到节省搜索的时间的目的。那么放两个数组来记录就行了,一个记之前最大的,一个记之后最小的,也就是前后都要遍历一遍。一个元素可以作为pivot,那么前面不可以有比它大的,后面不可以有比它小的。要注意的是N可能为0,没有元素给出,这时需要输出的是0,无元素。题中给的是N为positive integer,怎么会为0呢?测试点2是这个东西。我不知道是我理解的问题还是出题的问题。时间复杂度算是O(n)级别,挺好。

geooorge的博客 933

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言快速排序:以第一个元素为枢轴的实现与性能剖析

排序算法是计算机科学的基石,而快速排序凭借其分治思想与高效的平均性能,成为最经典的排序方法之一。其核心在于选取基准元素(pivot)并将数组划分为左右两部分,再通过递归对子区间进行排序。以第一个元素为枢轴的实现是教学中最常见的版本,它简化了代码逻辑,便于理解分区与递归的本质。然而,这种朴素实现面对有序输入时会退化为O(n²)时间复杂度,并可能导致递归栈过深。通过C语言完整实现与逐步调试,可以深入掌握partition的循环不变量、边界条件以及性能陷阱。从学术理论到工程实践,理解快速排序的局限性也是学习随机化

weixin_34072296的博客 251

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# (Implement Quicksort with first element as pivot)以第一个元素为枢轴元素实现快速排序

快速排序是一种分治算法。它选择一个元素作为枢轴,并围绕该枢轴对给定数组进行分区。快速排序有很多不同的版本,它们选择枢轴的方式各不相同。 始终选择第一个元素作为枢轴。始终选择最后一个元素作为枢轴点。随机选择一个元素作为枢轴。选择中位数作为枢轴点。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 5657

Python (Implement Quicksort with first element as pivot)以第一个元素为枢轴元素实现快速排序

快速排序是一种分治算法。它选择一个元素作为枢轴,并围绕该枢轴对给定数组进行分区。快速排序有很多不同的版本,它们选择枢轴的方式各不相同。 始终选择第一个元素作为枢轴。始终选择最后一个元素作为枢轴点。随机选择一个元素作为枢轴。选择中位数作为枢轴点。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 5813

Java (Implement Quicksort with first element as pivot)以第一个元素为枢轴元素实现快速排序

快速排序是一种分治算法。它选择一个元素作为枢轴,并围绕该枢轴对给定数组进行分区。快速排序有很多不同的版本,它们选择枢轴的方式各不相同。 始终选择第一个元素作为枢轴。始终选择最后一个元素作为枢轴点。随机选择一个元素作为枢轴。选择中位数作为枢轴点。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 5825

C语言 (Implement Quicksort with first element as pivot)以第一个元素为枢轴元素实现快速排序

快速排序是一种分治算法。它选择一个元素作为枢轴,并围绕该枢轴对给定数组进行分区。快速排序有很多不同的版本,它们选择枢轴的方式各不相同。 始终选择第一个元素作为枢轴。始终选择最后一个元素作为枢轴点。随机选择一个元素作为枢轴。选择中位数作为枢轴点。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 5890

JavaScript (Implement Quicksort with first element as pivot)以第一个元素为枢轴元素实现快速排序

快速排序是一种分治算法。它选择一个元素作为枢轴,并围绕该枢轴对给定数组进行分区。快速排序有很多不同的版本,它们选择枢轴的方式各不相同。 始终选择第一个元素作为枢轴。始终选择最后一个元素作为枢轴点。随机选择一个元素作为枢轴。选择中位数作为枢轴点。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 6046

JavaScript (QuickSort using Random Pivoting)使用随机枢轴的快速排序

本文探讨了使用随机枢轴实现快速排序的方法。通过分析Lomuto和Hoare两种分区方案,阐述了随机枢轴如何优化快速排序的平均时间复杂度至O(NlogN)。文章提供了完整的JavaScript实现代码,包括随机枢轴生成、分区处理和递归排序等关键步骤。虽然最坏情况时间复杂度仍为O(N^2),但随机枢轴能有效避免极端情况。实现展示了从数组中选择随机枢轴、分区处理以及递归排序的具体过程,最终输出正确排序结果。该算法空间复杂度为O(N),主要来自递归调用栈的使用。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 5944

java 中提供的默认的快速排序的实现

/* * Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it

程序员之路 7043

手写快速排序:从原理到工程化实现的面试通关指南

排序算法是计算机科学的基础,其核心在于通过特定策略高效地组织数据。快速排序作为分治思想的经典代表,通过选取枢轴将数组划分为子序列并递归排序,实现了平均O(n log n)的时间复杂度。该算法的技术价值在于其高效的原址排序能力,常作为系统库函数的基础。在工程实践中,快速排序广泛应用于大数据处理、数据库索引构建及编程语言内置排序函数等场景。然而,手写实现时,**边界条件**的精确处理与**递归调用**的严谨控制成为关键挑战,直接影响代码的健壮性与性能表现。本文聚焦于如何将这些基础概念转化为可通过面试考验的、无缺

weixin_34184561的博客 405

快速排序的几种pivot基数选择方法

随机基数快排:随机选取index,然后和最左或者最右元素交换,转换成已解决的问题。随机基数下我们期望平均情况下对数组的paritition比较均衡,并且对一些极端例子的最坏情况下的处理会更好。(主要是最后pivot是和i还是i+1交换,注意到 i作为维持partition的分界线,i 左边的元素都比pivot小,i 右边的元素都比pivot大。以右pivot为例子,与右pivot交换的必定是i右边的元素,否则的话不能维持右侧parition都大于pivot的性质)partition中的index非常易错。.

qq_61936207的博客 863

Python双指针法,快速排序,这次不要再忘了

双指针法来实现快速排序 流程 每轮都设定一个pivot即枢轴,将所有小于pivot的元素都移到其左边,将所有大于pivot的元素都移到其右边。 经过这样处理后,这个pivot位置就不动了,所在位置就是它最后排好序的位置了。再分别递归处理pivot左边和右边的部分。 要达成上述的效果,每轮处理过程分两步走:1.用双指针调整元素之间的位置 2.交换左右指针重合位置的与元素和pivot。 所用的双指针法有点像剑指 Offer 21. 调整数组顺序使奇数位于偶数前面,也是指针分别从头尾出发,但判断条件就不那么

qq_33890822的博客 1473
上一篇: 该死的回调函数
下一篇: 二叉排序树的基本操作
Leopard_89
博客等级 码龄15年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值