快速排序中的分割算法实现

1050:分割排序 1050:分割排序分数: 1 时间限制:1 秒 内存限制:32 兆 特殊判题: 否 提交:18 解决: 4 题目描述 输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。 你的任务是 阅读详情

这里介绍快速排序使用到的两种分割算法。

对于快速排序而言,先选定一个枢轴元素,以枢轴元素为基准比枢轴元素小的元素放在枢轴元素的左边,比枢轴元素大的元素放在枢轴元素的右边。这就是一次分割过程。

1,先介绍第一种分割算法

该算法是《算法导论》中描述的PARTITION过程。这个分割的思想应该有很多应用,比如应用到快速排序中,再比如应用到如果获取中位数(或者给定一组数,找出其中第K小的元素)

该分割算法的思想是,始终选定数组中的最后一个元素作为枢轴元素,设置指针 i 初始值为数组起始元素索引减1,设置指针 j 由数组下标从低到高扫描整个数组,若遇到的元素小于枢轴元素则 i 自增然后交换 i 数组元素的值和i 数组元素的值;若遇到的元素大于 枢轴元素则i指针不动,只有j指针自增。此算法的时间复杂度为O(n),空间复杂度为O(1)。

具体的JAVA实现代码如下,算法伪代码参考《算法导论》

/*
     * split array
     * this method always use the last elements as pivot.
     * when the method finished, the left elements of array smaller than pivot.
     * and the right elements of array larger than pivot.
     * @return  the pivot element in array
     */
    public int partition(int arr[], int low, int high) {
        int pivot = arr[high];
        int i = low - 1;
        for (int j = low; j < high; j++) {
            if (arr[j] <= pivot) {
                i++;
                swap(arr, i, j);
            }
        }
        swap(arr, i + 1, high);
        return i + 1;
    }

	/*
	 * switch two elements of arry
	 * @param int[] arr an array for switch
	 * @param int i, j index of array
	 * 
	 */
	private void swap(int[] arr, int i, int j){
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

2,第二种分割算法的实现思路

假设总是以第一个元素作为枢轴元素,设置两个指针low, high。low 指向数组的第一个元素,high 指向数组的最后一个元素。high 指针从后向前扫描,若碰到的元素大于枢轴元素则 high 直接自减,若碰到的元素小于枢轴元素则将该元素与枢轴元素交换并break 此次扫描。

high 指针的当次扫描被中断后,low 指针开始由前向后扫描,若碰到的元素小于枢轴元素则 low 直接自减,若碰到的元素大于枢轴元素则将该元素与枢轴元素交换并break 此次扫描。

直至low 指针 超过 high指针为止。

具体的实现参考:使用JAVA泛型实现快速排序


第一种分割算法的完整实现+测试版。

public class Partition {
	/*
	 * split array
	 * this method always use the last elements as pivot.
	 * when the method finished, the left elements of array smaller than pivot.
	 * and the right elements of array larger than pivot.
	 * @return  the pivot element in array
	 */
	public int partition(int arr[], int low, int high) {
		int pivot = arr[high];
		int i = low - 1;
		for (int j = low; j < high; j++) {
			if (arr[j] <= pivot) {
				i++;
				swap(arr, i, j);
			}
		}
		swap(arr, i + 1, high);
		return i + 1;
	}
	
	
	/*
	 * create a random pivot and use it to partition array
	 */
	public int randomPartition(int[] arr, int low, int high){
		int rand = getRandom(low, high);
		swap(arr, arr[rand], arr[high]);//arr[high] is a random and will be as pivot
		return partition(arr, low, high);
	}
	
	/*
	 * return a random between min and max----[min, max]
	 */
	private int getRandom(int min, int max){
		Random random = new Random();
		return  random.nextInt(max + 1) % (max-min+1) + min;
	}
	
	/*
	 * switch two elements of arry
	 * @param int[] arr an array for switch
	 * @param int i, j index of array
	 * 
	 */
	private void swap(int[] arr, int i, int j){
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
	
	public static void main(String[] args) {
		Partition p = new Partition();
		int arr[] = {3,5,9,6,2,8};
		int result = p.partition(arr, 0, arr.length - 1);
		System.out.println(result);
		System.out.println(arr);
	}
}


借助partition方法,实现快速排序就很容易了。代码如下:

public void quickSort(int[] arr, int low, int high){
		if(low < high){
			int pivot_location = partition(arr, low, high);
			quickSort(arr, low, pivot_location - 1);
			quickSort(arr, pivot_location + 1, high);
		}
	}





CH376S模块实战:如何通过串口轻松实现单片机与U盘的数据交互 本文详细介绍了如何利用CH376S模块,通过串口通信实现单片机与U盘的数据交互。文章从模块原理、硬件连接到核心指令集进行了全面解析,并提供了基于STM32的实战代码示例。CH376S模块极大地简化了USB协议和文件系统的复杂性,使开发者能快速为嵌入式设备添加便捷的数据存储与导出功能,适用于数据记录、配置导入等多种应用场景。 阅读详情

相关推荐

桁架 拓扑优化 matlab程序_拓扑优化在结构轻量化及板壳加筋肋最优布置的应用...

1 拓扑优化简介材料的有效利用一直都是人类追求的目标,也是许多研究领域不变的话题,并伴随着结构优化理论和方法的产生而发展。结构优化设计通常分为三个层次:(1)拓扑优化:在一个确定的连续区域内寻求结构内部非实体区域位置和数量的最佳配置,寻求结构中的构件布局及节点联结方式最优化,使结构能在满足应力、位移等约束条件下,将外载荷传递到结构支撑位置,同时使结构的某种性态指标达到最优;(2)形状优化:指在保持...

weixin_39525355的博客 1877

快速排序、归并排序、数组切分(Partition Array)、Quick Select算法总结

文章目录1. 快速排序思路代码2. 归并排序思路代码3. 数组切分问题(Partition Array)3.1 [LintCode-31. Partition Array](https://www.lintcode.com/problem/partition-array/description)题意思路代码3.2 [LintCode373. Partition Array by Odd and E...

超级无敌小胖头 920

西门子RS485自由口通信Modbus RTU 通信协议

部分西门子的RS485模块不能使用西门子自带的Modbus RTU通信指令,需要通过自己拼接、发送、接收和解析报文完成Modbus RTU通信。通过多次尝试完成该功能: #R_TRIG_Instance(CLK := #触发, Q => #触发上升沿); IF #触发上升沿 THEN // 触发后先将读取完成复位 #读写完成 := 0; END_IF; CASE #功能码 OF 1: // 线圈状态读取 ; 2:

qq_20792765的博客 1万+

高等排序——分割与快速排序

快速排序在分割的过程中会交换不相邻的元素,因此属于不稳定的排序算法快速排序的效率与key值的选取息息相关,如果在分割时能恰好选到中间值,则整个过程与归并排序一样,大致分为层,平均时间复杂度为O(nlogn),是一般情况下最高效的排序算法。若像我的上述代码(前后指针法)一样,采用固定的方式选取key值,那么当处理某些顺序的数据(如已经排序完毕的数组)的时候,效率会大打折扣,最坏的情况,时间复杂度甚至高达O(),甚至有可能导致递归的深度过大而栈溢出。

Se_ren_di_pity的博客 1984

三菱CNC数据采集实战:从环境搭建到代码实现的完整指南

本文提供了一份完整的三菱CNC数据采集实战指南,涵盖从开发环境搭建、核心SDK获取、网络配置到基于C#和A2协议的完整代码实现。文章详细解析了初始化、连接管理、数据获取与展示四大核心模块,并分享了错误处理、性能优化及与MES系统集成的关键技巧,帮助工程师快速构建稳定可靠的工业数据采集系统。

wood5的博客 889

STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收

STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收

weixin_43864631的博客 1万+

基于顺序搜索的动态分区分配算法

有以下四种算法: 最佳适应法 最坏适应法 首次适应法 下次适应法(循环首次适应法) 1) 首次适应算法(First Fit): 从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大

今晚打老虎 7919

【机器学习-18】特征筛选:提升模型性能的关键步骤

我们将介绍不同类型的特征筛选方法,包括基于统计的方法、基于模型的方法和嵌入式方法等,并详细解释每种方法的原理和适用场景。通过特征筛选,我们可以减少数据集的维度,降低模型的复杂度,提高模型的泛化能力,并加速模型的训练过程。通过选择适当的特征筛选方法,我们可以减少模型的复杂度,提高模型的泛化能力,并加速模型的训练过程。然而,并非所有的特征都对模型的性能提升有所贡献,有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关的。我们的目标是通过特征筛选选择出对欺诈检测最有用的特征,以提高模型的预测精度。

qq_38614074的博客 1万+

1050: 分割排序

题目描述 输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。 输入 输入包含多组测试数据。每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。 ...

weixin_30355437的博客 428

DeepSeek赋能公文写作指南(一)

DeepSeek 的出现,为公文写作领域带来了新的曙光。作为先进的人工智能技术,DeepSeek 以其强大的语言理解与生成能力,能为公文写作提供全方位的支持。它可以快速梳理思路,提供丰富的素材参考,辅助优化语言表达,甚至能根据不同的公文类型和场景,生成极具价值的内容框架。《DeepSeek 赋能公文写作指南》正是基于此背景应运而生。本书旨在帮助公文写作者深入了解并充分利用 DeepSeek 这一强大工具,将其融入到公文写作的各个流程中。

通俗易懂学IT 5484

ECU诊断功能测试:从理论到实践

ECU诊断功能是指通过特定的诊断协议与ECU进行通信,以获取ECU的状态信息、故障码、数据流等,并执行特定的诊断操作。诊断功能的主要目的是帮助开发人员和维修人员快速定位和解决ECU中的问题,确保车辆的安全性和可靠性。UDS协议是ISO 14229标准的一部分,定义了一系列的诊断服务,如读取故障码、清除故障码、读取数据流等。UDS协议基于CAN(Controller Area Network)总线,具有较高的灵活性和扩展性。读取故障码是诊断功能中最基本的操作之一。通过读取故障码,可以快速定位ECU中的问题。

闲人编程的博客 1806

使用分割思想实现快速排序算法

本文记录快速排序算法的一个精美实现,关于其中的一些优化或者思路请参考如下资料: 快速排序中的分割算法的解析与应用 http://www.cnblogs.com/hapjin/p/5518922.html http://blog.youkuaiyun.com/hapjin/article/details/49785477 http://blog.youkuaiyun.com/ha...

weixin_34344403的博客 110

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

挑战程序设计竞赛(算法和数据结构)——7.3分割(下)&快速排序的JAVA实现

在《挑战程序设计竞赛(算法和数据结构)——7.2分割(上)JAVA实现》中实现了将任一数组的元素以最后一个元素为界,小的排在前,大的排在后的功能,参照以下链接: https://blog.youkuaiyun.com/weixin_42887138/article/details/121386199 接下来基于上述工作直接介绍快速排序: 思路: 图解: java代码如下: import java.io.BufferedInputStream; import java.util.Scanner; public

小乖乖的臭坏坏 162

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java实现快速排序的分割思想:在快速排序算法中,我们随机在数组中选择一个数字,然后把比选中数字小的数字都排在它前面,比选中数字大的数字都排在它的后面。

package Nowcode; //快速排序的分割思想:在快速排序算法中,我们随机在数组中选择一个数字,然后把比选中数字小的数字都排在它前面,比选中数字大的数字都排在它的后面。 public class QuickSort { void quickSort(int[] data, int length, int start, int end) { if (start == end) {

pomay的博客 937

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

快速排序的算法思想

<br />http://c.chinaitlab.com/c/basic/200905/785203.html<br />快速排序的算法思想: 选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。<br /> // 对一个给定范围的子序列选定一个枢纽元素,执行完函数之后返回分割元素所在的位置,<br />// 在分割元素之前的元素都小于枢纽元素,在它后面的元素都大于这个元素<br />int Partition(int

shuiyingzi5的专栏 675

快速排序算法之所有版本的c/c++实现

,经过本人之前写的前俩篇关于快速排序算法的文章:第一篇、一、快速排序算法,及第二篇、一之续、快速排序算法的深入分析,各位,已经对快速排序算法有了足够的了解与认识。但仅仅停留在对一个算法的认识层次上,显然是不够的,即便你认识的有多透彻与深入。最好是,编程实现它。     而网上,快速排序的各种写法层次不清,缺乏统一、整体的阐述与实现,即,没有个一锤定音,如此,我便打算自己去实现它了。     于

cavehubiao的后备箱 791

Java实现快速排序算法

Java实现快速排序算法 算法思路: 快速排序是基于分治法的思想 利用三数中值分割法寻找支点,并将支点左侧的元素全部小于支点元素,支点右侧的元素全部大于支点元素,然后将此数组分为三个部分,支点,支点左边子数组和支点右边子数组。然后不断的对左右两部分进行此方法,一直到子数组的长度小于3,退出递归程序后即为排序好的数组 寻找支点的方法: 将数组的最左边和最右边和中间的元素进行由小到大的排序,并取中间元...

Mark的博客 396

用java实现快速排序算法

import java.util.Arrays; //快速排序 public class QuickSort { public static void main(String[] args) { int[] arr = new int[] { 0, 30, 100, 4, 4, 20, 10, 8, 4 }; System.out.println(Arrays.toString(arr)); ...

lzh_99999的博客 297

排序算法——快速排序.net实现

排序算法——快速排序.net实现基本思想算法图例编码实现总结分析 基本思想 通过一趟排序将要排序的数据分割成独立的两个部分,一部分的所有数据都比另一部分所有的数据都要小,然后按照此方法对这两部分的数据分别进行快速排序,整个排序的过程可以递归进行,以此将整个数据变成有序的序列。 算法图例 假如我们现在要对“6 1 2 7 9 3 4 5 10 8” 这10个数进行排序,在上一篇中我们采用冒泡排序将相...

Leaderxin的博客 5280

快速排序及算法实现

快速排序及算法实现 快速排序(Quick Sort) 是对冒泡排序的一种改进方法,在冒泡排序中,进行元素的比较和交换是在相邻元素之间进行的,元素每次交换只能移动一个位置,所以比较次数和移动次数较多,效率相对较低。而在快速排序中,元素的比较和交换是从两端向中间进行的,较大的元素一轮就能够交换到后面的位置,而较小的元素一轮就能交换到前面的位置,元素每次移动的距离较远,所以比较次数和移动次数较少,速度较...

weixin_39811685的博客 268

快速排序详解(图解实例)

快速排序(Quicksort)是对冒泡排序的一种改进。 它的基本思想是:通过一趟排序将要排序的数据 分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法 对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法介绍 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所...

wy15027539821的博客 1万+

快速排序基本思想以及代码实现

1、快速排序: (1)基本思想:通过一趟排序将要排序的数据分割成独立的两个部分,一部分的所有数据都比另一部分所有的数据都要小,然后按照此方法对这两部分的数据分别进行快速排序,整个排序的过程可以递归进行,以此将整个数据变成有序的序列。 a,先从数列中取出一个数作为基准数。 b,分区过程中,将比这个数大的数全放在它的右边,小于或者等于它的数放在它的左边。 c,再对左右区间重复第二步,直到各个区

minld的博客 3258

算法-快速排序

算法-快速排序 开始撸常用算法 理解快速排序算法 快速排序是冒泡排序的一种改进;通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列; 将画图展示快速排序算法的逻辑 有一组数据如下 这里我们将指定一个key,这个key默认可以为最后一个数据也可以为第一个数据,本分析使用的是第一个数据作为key; 为了保证key的随机性,可以生成一个left+1到right之间的

1978
上一篇: Apache Oozie 的执行模型理解
下一篇: 中位数和顺序统计学之求解顺序统计量
hapjin
博客等级 码龄13年 7粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值