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

news2025/1/18 5:36:21

题目链接: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]);
            else
                System.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.coloradmin.cn/o/1331309.html

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

相关文章

202355读书笔记|微读699元的书读后感——《走进美加风光摄影集》

202355读书笔记|微读699元的书读后感——《走进美加风光摄影集》 旧文新发&#xff0c;有一天跟同事聊起&#xff0c;我在某个平台写了30万字&#xff0c;ta很惊讶&#xff0c;其实还有很多私密的&#xff0c;公开的话更多&#xff0c;这或许是北飘留给我的礼物吧&#xff0c;在…

MFC窗体背景颜色的设置、控件白色背景问题、控件文本显示重叠问题、被父窗体背景覆盖的问题

文章目录 设置mfc窗体背景颜色窗体设置背景颜色后解决控件白色背景解决重复修改控件文本后重叠的问题自绘控件被父窗体背景覆盖的问题 设置mfc窗体背景颜色 设置窗体的背景颜色非常简单&#xff0c;只需要在窗体的OnEraseBkgnd里面填充窗体背景就可以了&#xff0c;甚至直接画…

在 linux 服务器上安装Redis数据库

先打开我们的Linux服务器 终端执行 安装redis sudo yum install redis然后 他会提示你要占多少磁盘空间 例如 我这里是 1.7 M 没问题就 y 然后回车就可以了 然后 我们这里执行 redis-cli --version这样 就能看到版本了 然后 我们可以根据版本选择启动命令 使用systemctl命…

【数据结构】最短路径算法实现(Dijkstra(迪克斯特拉),FloydWarshall(弗洛伊德) )

文章目录 前言一、Dijkstra&#xff08;迪克斯特拉&#xff09;1.方法&#xff1a;2.代码实现 二、FloydWarshall&#xff08;弗洛伊德&#xff09;1.方法2.代码实现 完整源码 前言 最短路径问题&#xff1a;从在带权有向图G中的某一顶点出发&#xff0c;找出一条通往另一顶点…

Ubuntu 常用命令之 gunzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 gunzip是一个在Ubuntu系统下用于解压缩文件的命令。它主要用于解压.gz格式的文件。这个命令是gzip命令的反向操作&#xff0c;gzip用于压缩文件&#xff0c;而gunzip则用于解压缩文件。 gunzip命令的参数有 -c 或 --stdout 或 -…

智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定…

Java语法---使用sort进行排序

目录 一、升序 二、降序 &#xff08;1&#xff09;类实现接口 &#xff08;2&#xff09;匿名内部类 三、自定义排序规则 四、集合中的sort排序 &#xff08;1&#xff09;升序 &#xff08;2&#xff09;降序 &#xff08;3&#xff09;自定义排序 一、升序 升序排…

IDEA——IDEA中文件内容对比功能的使用,如何快速定位看文件内容是否产生变化!!!

文件内容对比 一、对比磁盘中的某一文件二、直接对比两个文件 总结 本篇文章介绍一下如何在IDEA中对比两个文件的内容是否相同。 一、对比磁盘中的某一文件 选中一个文件&#xff0c;右键->点击Compare With 选择要对比的文件即可 二、直接对比两个文件 同时选中两个文…

基于协同过滤的电影评论数据分析与推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目介绍 随着社会的发展&#xff0c;人们生活水平的提高&#xff0c;欣赏电影逐渐成为人们闲暇时的主要娱乐方式之一。本文电影推荐系统是为了给顾客提供方便快捷的热门电影推荐以及查询电影资讯而建立的&…

C# 跨越配置

跨越配置1 项目框架 .NET Framework 1.web.config配置 在system.webServer节点中添httpProtocol子节点 Access-Control-Allow-Origin值为“*”” <httpProtocol><customHeaders><add name"Access-Control-Allow-Origin" value"*" /><…

redis 从0到1完整学习 (六):Hash 表数据结构

文章目录 1. 引言2. redis 源码下载3. dict 数据结构4. 哈希表扩容与 rehash5. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;red…

MATLAB - 估计滤波器(Estimation Filters)

系列文章目录 前言 本篇文章翻译自官网&#xff0c;部分下标有问题&#xff0c;请自行分辨。 一、背景介绍 1.1 估算系统 对于许多自主系统&#xff08;autonomous systems&#xff09;来说&#xff0c;了解系统状态&#xff08;system state&#xff09;是设计任何应用的先决…

Linux命令-查看内存、GC情况及jmap 用法

查看进程占用内存、CPU使用情况 1、查看进程 #jps 查看所有java进程 #top 查看cpu占用高进程 输入m &#xff1a;根据内存排序 topMem: 16333644k total, 9472968k used, 6860676k free, 165616k buffers Swap: 0k total, 0k used, 0k free, 6…

【网络编程】网络通信基础——简述TCP/IP协议

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、ip地…

全网最全ChatGPT指令大全prompt

全网最全的ChatGPT大全提示词&#xff0c;大家可以进行下载。 AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作 PowerBI 商业智能 68集 数据库Mysql 8.0 54集 数据库Oracle 21C 142集 Office 2021实战应用 Python 数据分析实战&#xff0c; ETL Informatica 数据仓库案例实战 E…

The Cherno C++笔记02

目录 Part 06 How the C Compiler Works 1.编译过程 2.C并不关心文件 3.翻译单元&#xff08;Translation Unit&#xff09; 4. 实际用代码感受一下编译过程 4.1 预处理 4.1.1 预处理的本质 4.1.2 预处理后的.i文件 4.1.3 骚操作 4.2 .asm文件&#xff08;汇编语言源文…

手把手教你在飞书中搭建机器人

前言 大家好&#xff0c;我是潇潇雨声。飞书是一款在国内广受欢迎的企业内部管理和协同工具&#xff0c;同时也可以作为一个强大的个人知识管理工具。在本文中&#xff0c;我将帮助你迅速创建一个飞书对话机器人&#xff0c;并嵌入 chatGPT 的功能。这个机器人可以直接回答你的…

贪吃蛇(七)方向和屏幕刷新

由于用户玩游戏的时候&#xff0c;程序需要一边接收用户的输入&#xff0c;一边需要刷新屏幕&#xff0c;此时就需要引用线程来解决此问题。 实现思路 linux线程库pthread&#xff0c;只需要创建pthread_t 类型的线程变量&#xff0c;然后将线程变量与函数进行绑定即可&#…

HFish蜜罐搭建及简单使用

一、HFish蜜罐 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的…

一篇文章带你搞定CTFMice基本操作

CTF比赛是在最短时间内拿到最多的flag&#xff0c;mice必须要有人做&#xff0c;或者一支战队必须留出一块时间专门写一些mice&#xff0c;web&#xff0c;pwn最后的一两道基本都会有难度&#xff0c;这时候就看mice的解题速度了&#xff01; 说实话&#xff0c;这是很大一块&…