当前位置: 首页 > news >正文

快速排序原理JAVA和Scala实现-函数式编程的简洁演示

快速排序原理JAVA和Scala实现-函数式编程的简洁演示

目录

快速排序原理JAVA和Scala实现-函数式编程的简洁演示

C语言快速排序实现

Java 快速排序实现

Scala 快速排序实现


 

 

 

本文章向大家介绍快速排序原理JAVA和Scala实现-函数式编程的简洁演示,主要内容包括C语言快速排序实现、Java 快速排序实现、Scala 快速排序实现、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

 

 

 

高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列: 3 1 2 5 4 6 9 7 10 8 在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。想一想,你有办法可以做到这点吗? 排序算法显神威 方法其实很简单:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即=10),指向数字。

094811yilrz1tkzkvlrriz.png

首先哨兵j开始出动。因为此处设置的基准数是最左边的数,所以需要让哨兵j先出动,这一点非常重要(请自己想一想为什么)。哨兵j一步一步地向左挪动(即j--),直到找到一个小于6的数停下来。接下来哨兵i再一步一步向右挪动(即i++),直到找到一个数大于6的数停下来。最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。

095

现在交换哨兵i和哨兵j所指向的元素的值。交换之后的序列如下: 6 1 2 5 9 3 4 7 10 8

 

 

到此,第一次交换结束。接下来开始哨兵j继续向左挪动(再友情提醒,每次必须是哨兵j先出发)。他发现了4(比基准数6要小,满足要求)之后停了下来。哨兵i也继续向右挪动的,他发现了9(比基准数6要大,满足要求)之后停了下来。此时再次进行交换,交换之后的序列如下: 6 1 2 5 4 3 9 7 10 8

 

第二次交换结束,“探测”继续。哨兵j继续向左挪动,他发现了3(比基准数6要小,满足要求)之后又停了下来。哨兵i继续向右移动,糟啦!此时哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。说明此时“探测”结束。我们将基准数6和3进行交换。交换之后的序列如下: 3 1 2 5 4 6 9 7 10 8

 

 

到此第一轮“探测”真正结束。此时以基准数6为分界点,6左边的数都小于等于6,6右边的数都大于等于6。回顾一下刚才的过程,其实哨兵j的使命就是要找小于基准数的数,而哨兵i的使命就是要找大于基准数的数,直到i和j碰头为止。 OK,解释完毕。现在基准数6已经归位,它正好处在序列的第6位。此时我们已经将原来的序列,以6为分界点拆分成了两个序列,左边的序列是“3 1 2 5 4”,右边的序列是“9 7 10 8”。接下来还需要分别处理这两个序列。因为6左边和右边的序列目前都还是很混乱的。不过不要紧,我们已经掌握了方法,接下来只要模拟刚才的方法分别处理6左边和右边的序列即可。现在先来处理6左边的序列现吧。 左边的序列是“3 1 2 5 4”。请将这个序列以3为基准数进行调整,使得3左边的数都小于等于3,3右边的数都大于等于3。好了开始动笔吧 如果你模拟的没有错,调整完毕之后的序列的顺序应该是:

2 1 3 5 4 OK,现在3已经归位。接下来需要处理3左边的序列“2 1”和右边的序列“5 4”。对序列“2 1”以2为基准数进行调整,处理完毕之后的序列为“1 2”,到此2已经归位。序列“1”只有一个数,也不需要进行任何处理。至此我们对序列“2 1”已全部处理完毕,得到序列是“1 2”。序列“5 4”的处理也仿照此方法,最后得到的序列如下: 1 2 3 4 5 6 9 7 10 8 对于序列“9 7 10 8”也模拟刚才的过程,直到不可拆分出新的子序列为止。最终将会得到这样的序列,如下 1 2 3 4 5 6 7 8 9 10 到此,排序完全结束。细心的同学可能已经发现,快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。下面上个霸气的图来描述下整个算法的处理过程。

这是为什么呢?快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2 ),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。我们后面还会遇到“二分”思想,到时候再聊。

C语言快速排序实现

#include <stdio.h> 
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 
void quicksort(int left,int right) 
{ int i,j,t,temp; if(left>right) return; temp=a[left]; //temp中存的就是基准数 i=left; j=right; while(i!=j) { //顺序很重要,要先从右边开始找 while(a[j]>=temp && i<j) j--; //再找右边的 while(a[i]<=temp && i<j) i++; //交换两个数在数组中的位置 if(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; } } //最终将基准数归位 a[left]=a[i]; a[i]=temp; quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程 quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程 
} 
int main() 
{ int i,j,t; //读入数据 scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); quicksort(1,n); //快速排序调用 //输出排序后的结果 for(i=1;i<=n;i++) printf("%d ",a[i]); getchar();getchar(); return 0; 
} 

Java 快速排序实现

package com.bjsxt.study;/*** Created by Albert on 2017/6/6.*/
public class QuickSort {public static void main(String[] args) {int[] testArray = { 3,12,43,23,7,1,2,0 };quickSort(testArray);for (int i = 0 ;i<testArray.length;i++){System.out.print (testArray[i]+",");}}public static void quickSort(int[] array){if(array != null){quickSort(array, 0, array.length-1);}}private static void quickSort(int[] array,int beg,int end){if(beg >= end || array == null)return;int p = partition(array, beg, end);quickSort(array, beg, p-1);quickSort(array, p+1, end);}private static int partition(int[] array, int beg, int end) {int first = array[beg];int i = beg, j = end;while (i < j) {while (array[i] <= first && i < end) {i++;}while (array[j] > first && j >= beg) {j--;}if (i < j) {array[i] = array[i] ^ array[j];array[j] = array[i] ^ array[j];array[i] = array[i] ^ array[j];}}if (j != beg) {array[j] = array[beg] ^ array[j];array[beg] = array[beg] ^ array[j];array[j] = array[beg] ^ array[j];}return j;}
}

Scala 快速排序实现

package com.bjsxt.study/*** Created by Albert on 2017/6/6.*/
object T10QuickSort {def quickSort(list: List[Int]): List[Int] = {list match {case Nil => Nilcase List() => List()case head :: tail =>val (left, right) = tail.partition(_ < head)quickSort(left) ::: head :: quickSort(right)}}def main(args: Array[String]) {val list = List(3, 12, 43, 23, 7, 1, 2, 0)println(quickSort(list))}
}

 

 

相关文章:

快速排序原理JAVA和Scala实现-函数式编程的简洁演示

快速排序原理JAVA和Scala实现-函数式编程的简洁演示 目录 快速排序原理JAVA和Scala实现-函数式编程的简洁演示 C语言快速排序实现 Java 快速排序实现 Scala 快速排序实现 本文章向大家介绍快速排序原理JAVA和Scala实现-函数式编程的简洁演示&#xff0c;主要内容包括C语言…...

如何在linux服务器上安装Anaconda与pytorch

如何在linux服务器上安装Anaconda与pytorch 1&#xff0c;安装anaconda1.1 下载anaconda安装包1.2 安装anaconda1.3 设计环境变量1.4 安装完成验证 2 Anaconda安装pytorch2.1 创建虚拟环境2.2 查看现存环境2.3 激活环境2.4 选择合适的pytorch版本下载2.5 检测是否安装成功&…...

FPGA设计FIR滤波器低通滤波器,代码及视频

名称&#xff1a;FIR滤波器低通滤波器 软件&#xff1a;Quartus 语言&#xff1a;Verilog/VHDL 本资源含有verilog及VHDL两种语言设计的工程&#xff0c;每个工程均可实现以下FIR滤波器的功能。 代码功能&#xff1a; 设计一个8阶FIR滤波器&#xff08;低通滤波器&#xff…...

【数据结构】排序--快速排序

目录 一 概念 二 快速排序的实现 1. hoare版本 (1)代码实现 (2)单趟排序图解 (3) 递归实现图解 (4)细节控制 (5)时间复杂度 (6)三数取中优化 2 挖坑法 (1)代码实现 (2)单趟图解 3 前后指针法 (1) 代码实现 (2) 单趟图解 ​4 优化子区间 5 非递归快速排序 …...

【试题040】多个逻辑或例题2

1.题目&#xff1a;设int n0;&#xff0c;执行表达式n ||(n-1) ||(n0)||(n1)||(n2)后n的值是 &#xff1f; 2.代码解析&#xff1a; 逻辑或 || 运算符是一个短路运算符&#xff0c;它从左到右依次计算表达式&#xff0c;如果遇到一个为真&#xff08;非零&#xff09;的值&am…...

自然语言处理---Self Attention自注意力机制

Self-attention介绍 Self-attention是一种特殊的attention&#xff0c;是应用在transformer中最重要的结构之一。attention机制&#xff0c;它能够帮助找到子序列和全局的attention的关系&#xff0c;也就是找到权重值wi。Self-attention相对于attention的变化&#xff0c;其实…...

推荐收藏系列!2万字图解Hadoop

今天我用图解的方式讲解pandas的用法&#xff0c;内容较长建议收藏&#xff0c;梳理不易&#xff0c;点赞支持。 学习 Python 编程&#xff0c;给我的经验就是&#xff1a;技术要学会分享、交流&#xff0c;不建议闭门造车。一个人可能走的很快、但一堆人可以走的更远。如果你…...

Python高级篇(08):生成器

一、生成器定义和作用 定义&#xff1a;Python中&#xff0c;一边循环一边计算的机制&#xff0c;生成器对象也是迭代器对象&#xff0c;支持for循环、next()方法…等。作用&#xff1a;循环的过程中不断推算出后续的元素&#xff0c;这样就不必创建完整的list&#xff0c;从而…...

力扣100114. 元素和最小的山形三元组 II(中等)

题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a; i < j < knums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小 的山形三元组…...

LuatOS-SOC接口文档(air780E)--lcdseg - 段式lcd

常量 常量 类型 解释 lcdseg.BIAS_STATIC number 没偏置电压(bias) lcdseg.BIAS_ONEHALF number 1/2偏置电压(bias) lcdseg.BIAS_ONETHIRD number 1/3偏置电压(bias) lcdseg.BIAS_ONEFOURTH number 1/4偏置电压(bias) lcdseg.DUTY_STATIC number 100%占空比(d…...

实现图像处理和分析的关键技术

在计算机视觉中&#xff0c;我们可以利用摄像头捕捉到的图像来进行各种分析和处理。以下是一些常见的计算机视觉任务&#xff1a; 对象检测&#xff1a;识别图像中的特定对象并标注其位置。人脸识别&#xff1a;识别和验证人脸身份。姿态估计&#xff1a;估计人体的姿态和动作…...

【C++学习笔记】内联函数

1. 概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 如果在上述函数前增加inline关键字将其改成内联函数&#xff0c;在编译期间编译器会用函数…...

macOS Sonoma 14.1RC(23B73)发布

黑果魏叔10 月 18 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.1 RC更新&#xff08;内部版本号&#xff1a;23B73&#xff09;&#xff0c;本次更新距离上次发布隔了 7 天。 macOS Sonoma 14.1RC&#xff08;23B73&#xff09;的更新内容主要包括以下方面&…...

数据结构数组 Array 手写实现,扩容原理

数组数据结构 数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一组具有相同类型数据的集合。 数组的特点&#xff1a; 数组是相同数据类型的元素集合&#xff08;int 不能存放 double&#xff09;数组中各元素的存储是有先…...

工作中几个问题的思考

对于需要并行多公司并行处理的任务&#xff0c;方案是什么&#xff1f; 多线程、并行流、并发库&#xff08;ExecutorService、Futrue、Callable&#xff09;&#xff0c;分布式计算&#xff08;1&#xff09;按照公司ID分片 &#xff08;2&#xff09;按照业务类型分片 处理…...

Jmeter的性能测试

性能测试的概念 定义&#xff1a;软件的性能是软件的一种非功能特性&#xff0c;它关注的不是软件是否能够完成特定的功能&#xff0c;而是在完成该功能时展示出来的及时性。 由定义可知性能关注的是软件的非功能特性&#xff0c;所以一般来说性能测试介入的时机是在功能测试…...

IntelliJ IDEA 2020.2.1白票安装使用方法

先安装好idear Plugins 内手动添加第三方插件仓库地址&#xff1a;https://plugins.zhile.io 搜索&#xff1a;IDE Eval Reset插件进行安装 输入https://plugins.zhile.io 手动安装离线插件方法 安装包可以去笔者的CSDN资源库下载 安装mybaties插件...

【UCAS自然语言处理作业一】利用BeautifulSoup爬取中英文数据,计算熵,验证齐夫定律

文章目录 前言中文数据爬取爬取界面爬取代码 数据清洗数据分析实验结果 英文数据爬取爬取界面动态爬取 数据清洗数据分析实验结果 结论 前言 本文分别针对中文&#xff0c;英文语料进行爬虫&#xff0c;并在两种语言上计算其对应的熵&#xff0c;验证齐夫定律github: ShiyuNee…...

微信小程序之个人中心授权登录

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.了解微信授权登录 微信登录官网&#xff1a; 小程序登录https://developers.weixin.qq.com/miniprogram/d…...

Elasticsearch的聚集统计,可以进行各种统计分析

说明&#xff1a; Elasticsearch不仅是一个大数据搜索引擎&#xff0c;也是一个大数据分析引擎。它的聚集(aggregation)统计的REST端点可用于实现与统计分析有关的功能。Elasticsearch提供的聚集分为三大类。 度量聚集(Metric aggregation)&#xff1a;度量聚集可以用于计算搜…...

从理论到实践:GM(1,1)灰色预测模型的MATLAB一站式实现与检验

1. 灰色预测模型入门&#xff1a;当数据不足时的智慧选择 第一次接触灰色预测是在研究生时期&#xff0c;导师扔给我一组只有7个数据点的年度销售记录&#xff0c;要求预测未来两年的趋势。当时我满脑子都是"这怎么可能&#xff1f;"——传统时间序列分析至少需要30个…...

保姆级教程:用Python+Requests搞定携程汽车票数据爬取(附完整代码与常见报错解决)

Python爬虫实战&#xff1a;高效获取汽车票数据的完整解决方案 最近在帮朋友处理一个需求时&#xff0c;遇到了一个典型的爬虫场景&#xff1a;需要批量查询多个城市之间的汽车票班次信息。这个任务看似简单&#xff0c;但实际操作中会遇到各种技术挑战&#xff0c;特别是对于刚…...

Windows11+VS2022驱动开发环境配置实战:从零到驱动编译

1. 环境准备&#xff1a;Windows11与VS2022的完美组合 第一次接触Windows驱动开发的朋友可能会觉得门槛很高&#xff0c;但实际只要环境配置正确&#xff0c;整个过程就像搭积木一样简单。我最近在Windows11 22H2系统上实测了VS2022WDK的开发环境搭建&#xff0c;整个过程比想象…...

从OOM到SLA 99.99%:我们重构了12个GenAI微服务的HPA策略(附可落地的PromQL+K8s CRD配置模板)

第一章&#xff1a;从OOM到SLA 99.99%&#xff1a;我们重构了12个GenAI微服务的HPA策略&#xff08;附可落地的PromQLK8s CRD配置模板&#xff09; 2026奇点智能技术大会(https://ml-summit.org) 在支撑多模态大模型推理服务的过程中&#xff0c;原有基于CPU利用率的HPA策略频…...

别再手动改代码了!用Postman汉化插件5分钟搞定中文界面(附最新版下载)

5分钟解锁Postman中文界面&#xff1a;零代码汉化全攻略 第一次打开Postman时&#xff0c;满屏的英文术语是否让你望而却步&#xff1f;作为国内开发者&#xff0c;我们常常需要在这款强大的API测试工具和中文思维之间来回切换。其实&#xff0c;只需一个浏览器插件&#xff0…...

用JoinQuant写你的第一个量化策略:从Python零基础到跑通回测(附完整代码)

用JoinQuant写你的第一个量化策略&#xff1a;从Python零基础到跑通回测&#xff08;附完整代码&#xff09; 第一次听说量化交易时&#xff0c;很多人脑海中会浮现出华尔街精英对着六个屏幕同时操作的画面。但事实上&#xff0c;随着像JoinQuant这样的在线量化平台出现&#x…...

Python3 WebSocket实战:从基础连接到异步高并发,主流模块选型指南

1. WebSocket基础与Python模块选型指南 第一次接触WebSocket时&#xff0c;我被它和HTTP的长轮询对比惊艳到了。想象一下咖啡馆里两个朋友的对话&#xff1a;HTTP就像每次问"有新消息吗&#xff1f;"都要重新打招呼&#xff0c;而WebSocket则是一次握手后就能持续聊天…...

U盘如何防泄密?推荐六款常用的U盘防泄密软件,收藏了

在数字化办公的今天&#xff0c;U盘因为便携、好用&#xff0c;成了职场人几乎人手必备的工具。但对于企业管理者来说&#xff0c;这个小小的存储卡却可能成为安全漏洞的源头。一个不留神&#xff0c;公司的核心技术资料、客户名单或是财务报表&#xff0c;就可能随着一个几厘米…...

从DeepPS到工业实践:剖析基于DCNN的停车位检测算法演进与挑战

1. 停车位检测技术的现实挑战与需求 想象一下&#xff0c;你正开车进入一个陌生的地下停车场&#xff0c;昏暗的灯光下&#xff0c;地面反光严重&#xff0c;部分车位线已经模糊不清。这时候如果依赖传统计算机视觉算法&#xff0c;很可能连最基本的车位线都识别不出来。这正是…...

如何在 Pandas 中安全地对非空 DataFrame 执行行级操作

本文详解如何在 Pandas 中判断 DataFrame 是否为空&#xff0c;并在行级处理&#xff08;如 apply 或迭代&#xff09;中避免对空数据执行无效操作&#xff0c;重点推荐 iterrows() 空值前置校验的稳健方案。 本文详解如何在 pandas 中判断 dataframe 是否为空&#xff0c;并在…...