785. 快速排序

Problem: 785. 快速排序

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code
    • 方法一(调用系统类库)
    • 方法二(随机快速排序经典版)
    • 方法三 (利用荷兰国旗问题改写快排)

思路

这个问题要求实现快速排序算法,对给定的整数数组进行从小到大的排序。 快速排序算法的工作原理是从数组中选择一个“枢轴”元素,然后将其他元素分区为两个子数组,一个包含小于枢轴的元素,另一个包含大于枢轴的元素。然后通过对两个子数组递归调用快速排序算法进行排序。
快速排序的时间复杂度在最好和平均情况下为O(n log n),在最坏情况下为O(n^2),但对于大多数输入,最坏情况并不常见。空间复杂度为O(log n)到O(n),取决于快速排序的版本,并假设不计算存储输入所需的空间。

解题方法

  1. 方法一(调用系统类库):这种方法是最简单的,直接调用Java的Arrays.sort()方法对数组进行排序。
  1. 方法二(随机快速排序经典版):这种方法是快速排序的经典实现,通过随机选择一个元素作为枢轴,然后将数组分为两部分,一部分是小于枢轴的元素,另一部分是大于枢轴的元素,然后对这两部分分别进行快速排序。
  1. 方法三(利用荷兰国旗问题改写快排):这种方法是快速排序的一个变种,通过将数组分为三部分,一部分是小于枢轴的元素,一部分是等于枢轴的元素,一部分是大于枢轴的元素,然后对小于枢轴和大于枢轴的两部分分别进行快速排序。

复杂度

时间复杂度:

时间复杂度在最好和平均情况下是 O ( n l o g n ) O(n log n) O(nlogn),在最坏情况下是 O ( n 2 ) O(n^2) O(n2)

空间复杂度:

空间复杂度是 O ( l o g n ) O(log n) O(logn)

Code

方法一(调用系统类库)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int n;static int MAXN = 100001;static int[] arr = new int[MAXN];public static void main(String[] args) throws IOException {n = nextInt();for(int i = 0; i < n; i++) {arr[i] = nextInt();}Arrays.sort(arr, 0, n);StringBuffer sb = new StringBuffer();for(int i = 0; i < n; i++) {sb.append(arr[i]);sb.append(" ");}out.println(sb);out.flush();	}static int nextInt() throws IOException {sr.nextToken();return (int) sr.nval;}}

方法二(随机快速排序经典版)

未通过所有样例,这种方法不推荐

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int n;static int MAXN = 100001;static int[] arr = new int[MAXN];public static void main(String[] args) throws IOException {n = nextInt();for (int i = 0; i < n; i++) {arr[i] = nextInt();}quickSort(0, n - 1);StringBuffer sb = new StringBuffer();for (int i = 0; i < n; i++) {sb.append(arr[i]);sb.append(" ");}out.println(sb);out.flush();}public static void quickSort(int l, int r) {if (l >= r) {return;}int x = arr[l + (int) (Math.random() * (r - l + 1))];int mid = partition(l, r, x);quickSort(l, mid - 1);quickSort(mid + 1, r);}private static int partition(int l, int r, int x) {int a = l, xi = 0; // 记录等于x的位置for (int i = l; i <= r; i++) {if (arr[i] <= x) {swap(a, i);if (arr[a] == x) {xi = a;}a++;}}swap(xi, a - 1);return a - 1;}private static void swap(int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}static int nextInt() throws IOException {sr.nextToken();return (int) sr.nval;}}

方法三 (利用荷兰国旗问题改写快排)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int n;static int MAXN = 100001;static int[] arr = new int[MAXN];public static void main(String[] args) throws IOException {n = nextInt();for (int i = 0; i < n; i++) {arr[i] = nextInt();}quickSort(0, n - 1);StringBuffer sb = new StringBuffer();for (int i = 0; i < n; i++) {sb.append(arr[i]);sb.append(" ");}out.println(sb);out.flush();}public static int first, last;public static void quickSort(int l, int r) {if(l >= r) {return;}int x = arr[l + (int) (Math.random() * (r - l + 1))];partition(l, r, x);quickSort(l, first - 1);quickSort(last + 1, r);}private static void partition(int l, int r, int x) {if(l >= r) {return;}first = l;last = r;int i = l;while(i <= last) {if(arr[i] == x) {i++;} else if(arr[i] < x) {swap(i++, first++);} else {swap(i, last--);}}}private static void swap(int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}static int nextInt() throws IOException {sr.nextToken();return (int) sr.nval;}}

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

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

相关文章

网络的基本概念和socket编程

网络的基本概念 1.协议1.1 协议的基本概念1.2 常见的协议 2.分层模型2.1网络七层OSI 7层模型&#xff1a;物数网传会表应(口诀)2.2TCP/IP模型2.3数据通信的过程2.4网络的设计模式2.5以太网帧的格式 3.SOCKET编程3.1网络字节序3.2 相关结构体和函数3.3 代码实现 1.协议 1.1 协议…

前端JavaScript篇之对象继承的方式有哪些?

目录 对象继承的方式有哪些&#xff1f;1. 原型链继承2. 借用构造函数3. 组合继承4. 原型式继承5. 寄生式组合继承 对象继承的方式有哪些&#xff1f; 1. 原型链继承 当使用原型链继承时&#xff0c;子类型的原型对象被设置为父类型的一个实例。这意味着子类型通过其原型可以…

线性表的插入

#define MaxSize 10 //定义最大长度 typeof struct{ int data[MaxSize]; //用静态“数组”存放数据元素 int length; //顺序表的当前长度 }SeqList; //顺序表的类型定义 bool ListInsert(SeqList &L,int i,int e){ if(i<1 || i>L.length1)…

VUE学习——数组变化侦测

官方文档 变更方法&#xff1a; 使用之后&#xff0c;ui可以直接发生改变。改变原数组 替换数组&#xff1a; 使用之后需要接受重新赋值&#xff0c;不然ui不发生改变。不改变原数组

第70讲axios后端请求工具类封装

axios工具类封装&#xff1a; // 引入axios import axios from axios;// 创建axios实例 const httpService axios.create({// url前缀-http:xxx.xxx// baseURL: process.env.BASE_API, // 需自定义baseURL:http://localhost:80/,// 请求超时时间timeout: 3000 // 需自定义 })…

嵌入式系统:挑战与机遇并存的领域

嵌入式系统&#xff1a;挑战与机遇并存的领域嵌入式系统是一个既具有挑战性又充满前景的领域。要成为一名合格的嵌入式系统工程师&#xff0c;需要经过大量的学习和实践。然而&#xff0c;进入这个领域时&#xff0c;刚入行可能会面临许多困境。让我们一起探讨一下嵌入式系统工…

matplotlib的学习

matplotlib绘图两种方式: #面向对象方法 import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 5, 100) fig, ax = plt.subplots(figsize=(10, 5)) ax.plot(x, x) ax.plot(x, x ** 2) ax.set_xlabel(‘x’) ax.set_ylabel(‘y’) plt.show() #直接使用pyplo…

Python爬虫实战 | 京东平台电商API接口采集京东商品京东工业商品详情数据

item_get-获得JD商品详情API测试 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cac…

【Maven】依赖、构建管理 继承与聚合 快速学习(3.6.3 )

文章目录 Maven是什么&#xff1f;一、Maven安装和配置本地配置文件设置idea配置本地maven 二、基于IDEA的Maven工程创建2.1 Maven工程GAVP属性2.2 Idea构建Maven JavaEE工程 三、Maven工程项目结构说明四、Maven核心功能依赖和构建管理4.1 依赖管理和配置4.2 依赖传递和冲突4.…

【数学建模】【2024年】【第40届】【MCM/ICM】【E题 财产保险的可持续性】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem E: Sustainability of Property Insurance Extreme-weather events are becoming a crisis for property owners and insurers. The world has endured “more than $1 trillion in damages from more than …

华为机试真题实战应用【赛题代码篇】-自守数(附Java、C++和python代码)

目录 问题描述 思路解析 思路1 思路2 代码实现 Java 代码2

vue+springboot前后端视频文件等的上传与展示(基于七牛云)

前言&#xff1a;在初步说明完成功能之前&#xff0c;我会把重要的部分说明下。后续我会细化。 vue视频文件上传 其实这里和图片这些文件就是一样的。因为上传只是把我们想在云端展示的文件按等传输到云端的bucket。然后方便网站去请求引用。 有人问我我就说明下。这种东西无…

ClickHouse--02--安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装官网 &#xff1b;[https://clickhouse.com/docs/zh/getting-started/install](https://clickhouse.com/docs/zh/getting-started/install)![在这里插入图片描述…

c语言游戏实战(7):扫雷

前言&#xff1a; 扫雷是一款经典的单人益智游戏&#xff0c;它的目标是在一个方格矩阵中找出所有的地雷&#xff0c;而不触碰到任何一颗地雷。在计算机编程领域&#xff0c;扫雷也是一个非常受欢迎的项目&#xff0c;因为它涉及到许多重要的编程概念&#xff0c;如数组、循环…

Python中的嵌套字典访问与操作详解

前言 在Python编程中&#xff0c;嵌套字典是一种常见的数据结构&#xff0c;它可以以层次结构的方式组织和存储数据。嵌套字典通常包含字典内嵌套在其他字典中&#xff0c;创建了一种多层级的数据结构。本文将详细介绍如何在Python中访问和操作嵌套字典&#xff0c;包括访问、…

js中bind、call、apply 区别(如何实现)

文章目录 一、作用二、区别applycallbind小结 三、实现 一、作用 call、apply、bind作用是改变函数执行时的上下文&#xff0c;简而言之就是改变函数运行时的this指向 那么什么情况下需要改变this的指向呢&#xff1f;下面举个例子 var name "lucy"; var obj {n…

Android:Ionic框架使用实例

Ionic学习 ionic 是一个强大的 HTML5 应用程序开发框架(HTML5 Hybrid Mobile App Framework )。通过使用H5,JS,CSS构建接近原生体验的移动应用程序。 ionic放弃对IOS6和Android4.1以下的版本的支持,提高应用程序的运行效率。 Ionic官网地址: Ionic Framework - The Cross-Pla…

类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 C类的6个默认成员函数包括默认构造函数、析构函数、拷贝构造函数、拷贝赋值…

【leetcode热题100】 格雷编码

n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相邻 整数的二进制表示 恰好一位不同 &#xff0c;且第一个 和 最后一…

Linux基础-配置网络

Linux配置网络的方式 1.图形界面 右上角-wired-配置 点加号-新建网络配置文件2.NetworkManager工具 2.1用图形终端nmtui 1.新建网络配置文件add 1.指定网络设备的类型Ethernet 2.配置网络配置文件的名称&#xff0c;名称可以有空格 3.配置网络配置文件对应的物理网络设备的…