Java经典面试题——手写快速排序和归并排序

题目链接:https://www.luogu.com.cn/problem/P1177
在这里插入图片描述

输入模板:

5
4 2 4 5 1

快速排序

技巧:交换数组中的两个位置

a[l] = a[l] + a[r] - (a[r] = a[l]);

稳定不稳定?:不稳定

注意找哨兵那里内循环的等于号不能漏,不然能出不来循环了,因为如果数值都一样,那么l和r一直保持不变了

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] a = new int[1000005];for(int i = 1; i<= n;i++)a[i] = scanner.nextInt();scanner.close();quickSort(a,1,n);for(int i=1;i<=n;i++){if(i==1) System.out.print(a[i]);elseSystem.out.print(" "+a[i]);}return ;}//数组的传递时通过引用进行传递的public static void quickSort(int[] a, int left, int right){//设置一个哨兵,分治排序,使得小于哨兵的所有节点都小于他,大于哨兵的所有//节点都大于他if(left>=right)return ; int solder = partSort(a, left, right);quickSort(a, left, solder-1);quickSort(a, solder+1, right);return ;}public static int partSort(int[] a,int left,int right){int pivot=a[left];while(left<right) {//起初,一定要从右边指针开始,因为arr[low]的值已经扔给了pivot,arr[low]//想象成无数字的空位while(left<right&&pivot<=a[right])--right;//把比pivot的小的数扔到左边指针//把arr[high]扔到arr[low]这个空位上//然后,high位置可以想象成无数字的空位a[left]=a[right];while(left<right&&a[left]<=pivot)++left;//把比pivot大的数扔到右边//把arr[low]扔到arr[high]这个空位上//然后,low位置可以想象成是无数字的空位a[right]=a[left];}//此时low==high,return high也一样a[left]=pivot;return left;}   
}

归并排序

归并比快排好写

import java.util.*;public class Main {public static void main(String[] args) {//手写一个快排,分治排序Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] array = new int[n];for(int i = 0;i<=n-1;i++)array[i] = scanner.nextInt();QuickSort(array,0,n-1);for(int x:array)System.out.print(x+" ");}public static void QuickSort(int[] array,int left, int right){//System.out.println(left+" "+right);if(left>=right)return ;else{int mid = (left+right)/2;QuickSort(array, left, mid);QuickSort(array, mid+1, right);MergeArray(array,left,right,mid+1);}return ;}public static void MergeArray(int[] array,int left,int right,int mid){int[] temp = new int[array.length];int p = left,q = mid;for(int i=left;i<=right;i++){if(q>right||p<mid&&array[p]<array[q]){temp[i]=array[p];p++;}else{temp[i]=array[q];q++;}}for(int i=left;i<=right;i++){array[i] = temp[i];}return ;}
}

通过对比归并排序和快速排序,我们可以发现,归并排序和快速排序的区别在于

//快速排序
int solder = partSort(array, left, right);
QuickSort(array, left, solder-1);
QuickSort(array, solder+1, right);
//归并排序
QuickSort(array, left, mid);
QuickSort(array, mid+1, right);
MergeArray(array,left,right,mid+1);

一个的QuickSort在两次递归之前,一个在两次递归之后,因为归并是先拆后再合并,而快速排序我们需要知道哨兵的位置,所以需要先进行局部排序找到哨兵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis的ORM映射

目录 什么是ORM 一&#xff0c;列的别名 二&#xff0c;结果映射 三&#xff0c;总结 什么是ORM ORM&#xff1a;对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简…

力扣思维题——寻找重复数

题目链接&#xff1a;https://leetcode.cn/problems/find-the-duplicate-number/description/?envTypestudy-plan-v2&envIdtop-100-liked 这题的思维难度较大。一种是利用双指针法进行计算环的起点&#xff0c;这种方法在面试里很难说清楚&#xff0c;也很难想到。大致做…

idea structure视图介绍

作用 idea的Structure视图可以辅助查看代码结构 如何呼出Structure视图&#xff1f; Alt 7 Ctrl F12 侧边栏点Structure 我的常用配置 1、选Show Toolbar&#xff0c;便于使用功能按钮 2、使用Float视图&#xff0c;悬浮于窗口表面&#xff0c;可以使用 ShiftEsc来退出…

quic协议及核心源码分析

quic协议 1、网络通信时&#xff0c;为了确保数据不丢包&#xff0c;早在几十年前就发明了tcp协议&#xff01;然而此一时非彼一时&#xff0c;随着技术进步和业务需求增多&#xff0c;tcp也暴露了部分比较明显的缺陷&#xff0c;比如: 建立连接的3次握手延迟大&#xff1b; T…

c语言:文件操作(2),认识各种文件操作函数

fgets 作用 fgets是C语言标准库中用于从文件中读取字符串的函数。 fgets函数从指定的文件流stream中读取最多n-1个字符&#xff0c;或者直到遇到换行符&#xff08;包括换行符在内&#xff09;&#xff0c;并将其存储到以str指向的字符数组中。读取的字符串会以null字符\0结…

12.23C语言 指针

& 地址运算符&#xff0c;用于取地址 /*注释内容*/ //注释一行 *的意思&#xff1a;1.算术运算符 2.用于指针声明int *ptr;表示这个变量是一个指针3.数组元素访问&#xff1a;在数组名后面使用 * 可以表示数组的起始地址。例如&#xff1a; int arr[5] {1, 2, 3, 4, 5…

05. Springboot admin集成Actuator(一)

目录 1、前言 2、Actuator监控端点 2.1、健康检查 2.2、信息端点 2.3、环境信息 2.4、度量指标 2.5、日志文件查看 2.6、追踪信息 2.7、Beans信息 2.8、Mappings信息 3、快速使用 2.1、添加依赖 2.2、添加配置文件 2.3、启动程序 4、自定义端点Endpoint 5、自定…

干洗店预约上门取货小程序与互联网洗鞋店小程序开发制作功能方案

干洗店预约上门取货小程序与互联网洗鞋店小程序开发制作功能方案 一、洗衣洗鞋店小程序功能 1. 预约订单&#xff1a;忙碌时&#xff0c;您可以使用预约功能轻松获取洗衣服务。 2. 在线下单&#xff1a;用户可直接通过小程序在线下单&#xff0c;享受专人上门取货与配送服务。…

Unity2017升级到Unity2018在Window7上输出空异常错误问题

Unity2017升级到Unity2018在Window7上输出空异常错误问题 一、环境Window7二、现象Unity报空异常&#xff08;.NET 4.x Equivalent&#xff09;三、日志四、解决方案第一种解决方案第二种解决方案 一、环境Window7 二、现象Unity报空异常&#xff08;.NET 4.x Equivalent&…

小白入门之安装NodeJS

重生之我在大四学JAVA 第五章 安装NodeJS 如果你在购买我闲鱼的程序&#xff0c;请尽量使用node14版本 修改安装路径 接着傻瓜式NEXT 测试是否安装成功 如果上面没提示版本号&#xff0c;就按照前两章配置环境变量步骤配置下环境变量 设置镜像地址 npm config set re…

基于遗传算法特征选择及单层感知机模型的IMDB电影评论文本分类案例

基于遗传算法特征选择及单层感知机模型的IMDB电影评论文本分类案例 1.数据载入及处理2.感知机模型建立3.模型训练4.遗传算法进行特征选择注意 5.联系我们 1.数据载入及处理 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dat…

【Flutter】黑白图片

一、将图片处理成黑白图片 //第一种方法CachedNetworkImage(imageUrl: imageUrl,width: 80,height: 80,fit: BoxFit.cover,color: Colors.black,//目标颜色colorBlendMode: BlendMode.color,//颜色混合模式)//第二种方法ShaderMask(shaderCallback: (Rect bounds) {return Lin…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)Channel 模块的实现

在这篇文章中虽然实现了能够和多客户端建立连接&#xff0c;并且同时和多个客户端进行通信。 基于多反应堆的高并发服务器【C/C/Reactor】&#xff08;上&#xff09;-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135141316?spm1001.2014.3001.5501但是有…

抖店怎么做?新手又该如何从头开始运营?

我是电商珠珠 抖店发展了将近4年时间&#xff0c;一直都备受关注。第一是因为他的门槛低&#xff0c;第二是他的玩法和传统有所差别&#xff0c;第三就是流量来源渠道比较广。 这一年所立的flag不到最后关头绝对不能倒&#xff0c;所以就会有很多人奔着这几点来尝试做店&…

MATLAB遗传算法工具箱的三种使用方法

MATLAB中有三种调用遗传算法的方式&#xff1a; 一、遗传算法的开源文件 下载“gatbx”压缩包文件&#xff0c;解压后&#xff0c;里面有多个.m文件&#xff0c;可以看到这些文件的编辑日期都是1998年&#xff0c;很古老了。 这些文件包含了遗传算法的基础操作&#xff0c;包含…

ebay倒计时活动攻略,ebay倒计时活动怎么做的?——站斧浏览器

ebay倒计时活动攻略 在ebay上做倒计时活动时&#xff0c;可以参考以下攻略&#xff1a; 制定合理的ebay优惠方案。可以根据消费者的需求和购买习惯&#xff0c;制定不同的优惠方案&#xff0c;例如满减、折扣、赠品等。同时&#xff0c;要保证优惠方案的真实性和公平性&#…

wordpress主题modown v8.81+erphpdown v16.0无限制无授权开心版

修复bug&#xff08;v8.81 2023.03.07&#xff09; 新增文章页正文下面常见问题手风琴模块&#xff0c;可设置显示文章的更新日期而不是发布日期&#xff0c;首页幻灯片支持指定文章、支持一个大图4个小图显示&#xff0c;grid网格列表支持显示简介&#xff0c;前台个人中心里显…

Qt 多线程用法

文章目录 开发平台QThread 类 moveToThreadQtConcurrent::run QFutureWatcherQThreadPool QRunnable 开发平台 项目说明OSwin10 x64Qt6.6compilermsvc2022构建工具cmake QThread 类 moveToThread 写一个简单的例子吧,比较容易理解,方便入门. 也可以看出这种方式,对于线程…

如何使用 Selenium 实现自动化操作?

本篇咱们来谈谈Selenium自动化脚本是如何工作的&#xff0c;以及如何实现一个简单的自动化示例&#xff1b; 一、关于Selenium 1.1、为什么选择它作为web自动化的测试工具&#xff1f; 选择Selenium作为web自动化测试工具的原因&#xff08;面试也许会问&#xff09;&#xff…

NiNNet

目录 一、网络介绍 1、全连接层存在的问题 2、NiN的解决方案(NiN块) 3、NiN架构 4、总结 二、代码实现 1、定义NiN卷积块 2、NiN模型 3、训练模型 一、网络介绍 NiN&#xff08;Network in Network&#xff09;是一种用于图像识别任务的卷积神经网络模型。它由谷歌研究…