【Java】快速排序

代码:
1 public static void quickSort(int[] arr) {
2 if (arr == null || arr.length < 2) {
3 return;
4 }
5 quickSort(arr, 0, arr.length - 1);
6 }
7
8 public static void quickSort(int[] arr, int l, int r) {
9 if (l < r) {
10 swap(arr, l + (int) (Math.random() * (r - l + 1)), r);
11 int[] p = partition(arr, l, r);
12 quickSort(arr, l, p[0] - 1);
13 quickSort(arr, p[1] + 1, r);
14 }
15 }
16
17 public static int[] partition(int[] arr, int l, int r) {
18 int less = l - 1;
19 int more = r;
20 while (l < more) {
21 if (arr[l] < arr[r]) {
22 swap(arr, ++less, l++);
23 } else if (arr[l] > arr[r]) {
24 swap(arr, --more, l);
25 } else {
26 l++;
27 }
28 }
29 swap(arr, more, r);
30 return new int[] { less + 1, more };
31 }
32
33 public static void swap(int[] arr, int i, int j) {
34 int tmp = arr[i];
35 arr[i] = arr[j];
36 arr[j] = tmp;
37 }
理解:
什么是随机快速排序?
快速排序是在一个数组中,每次选定一个基准,然后把这个数组分为三部分(大于这个数的、等于这个数的、小于这个数的)
这三部分之中,等于标准数的这个部分,就是排好序的,它们不需要再动了。那么左右两边继续重复这个过程,在左边再次
选择一个标准数,右边也是一样,重复到最后,所有数的位置也就固定了!随机快速排序是在这个基础之上,每次选定的那
个数是随机产生的,普通快速排序可能会选择最右边的那个数或者最左边的数,这容易出现问题,比如 1234567 如果选定了
7这个数,那么从左往右走一遍,最后发现比7小的本身都在左边,那么这一遍排序其实是浪费了的,所以选定的那个数的位
置很重要!
partition这个方法的作用是返回每次快排之后那个数组的小于区的最右边界以及大于区的最左边界!是一个长度为2的数组!
递归方法:先对左侧递归完成左侧排序,再对右侧递归,完成右边排序,最终整体有序!
【Java】快速排序的更多相关文章
- Java 快速排序两种实现
快速排序,只要学习过编程的人肯定都听说过这个名词,但是有时候写的时候还真蒙住了,网上搜罗了下以及查阅了"introduction to algorithm",暂时找到两种实现快排的 ...
- java快速排序1000万无序数组JVM-Xmx=256M 耗时2s
自己动手写排序算法,快速排序是比较不好写的了~ import java.util.*; class Test{ public void quickSort(int[] arr,int low,int ...
- 面试 12:玩转 Java 快速排序
终于轮到我们排序算法中的王牌登场了. 快速排序由于排序效率在同为 O(nlogn) 的几种排序方法中效率最高,因此经常被采用.再加上快速排序思想——分治法也确实非常实用,所以 在各大厂的面试习题中,快 ...
- java快速排序引起的StackOverflowError异常
写在前面:这篇随笔主要记录一下递归调用引起的虚拟机栈溢出的情况以及通过参数配置了虚拟机栈大小来使递归调用可以顺利执行.并没有对涉及到的一些概念进行详细的解释(因为我自己目前对这些概念并不是特别清楚), ...
- Java 快速排序讲解
快速排序由于排序效率在同为 O(nlogn) 的几种排序方法中效率最高,因此经常被采用.再加上快速排序思想——分治法也确实非常实用,所以 在各大厂的面试习题中,快排总是最耀眼的那个.要是你会的排序算法 ...
- Java快速排序 分别以数组0位作为基准 和最后一位作为基准的排序演示
package util; public class Pub { public static void beforeSort(int[] arr){ System.out.println(" ...
- Java快速排序
快速排序: public int Partition(int[] nums, int low, int high) { int pivot = nums[low]; while (low < h ...
- java快速排序详解
快速排序 public class QuickSort { public static void main(String[] args) { int[] a = { 0, 3, 6, 8, 2, 4, ...
- Java快速排序算法
快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...
- java 快速排序
快速排序比插入排序快了两个数量级 package test.sort; public class Paixu { public static void main(String[] args) { // ...
随机推荐
- Python之正则表达式匹配电话号码和邮箱
代码 #! python3 # phoneAndEmail.py - Finds phone numbers and email addresses on Clipboard import pyper ...
- 李宏毅2022机器学习HW3 Image Classification
Homework3 数据集下载 在本地环境下进行实验总是令人安心,但是又苦于网上找不到数据集,虽然kaggle上有数据集但是下载存在问题 于是有了一个天才的想法,间接从kaggle上下载(利用outp ...
- Go微服务框架go-kratos实战学习06:配置中心使用-nacos作为配置中心和 file作为配置存储
一.kratos 配置介绍 配置文件的作用就是把一些会变化的配置项单独存放,与程序相剥离. 把配置项进行单独管理. kratos 支持多种形式的配置, 比如 file,环境变量. 还支持一些配置软件, ...
- shell之sort,uniq,cut,tr
# sort主要是要理解域 # sort选项 -c 测试文件是否已经分类 -m 合并两个分类文件 -u 删除所有复制行 -o 存储sort结果的输出文件名 -b 使用域进行分类时,忽略第一个空格 -n ...
- Python函数每日一讲 - 一文让你彻底明白hasattr函数的使用
引言 在Python编程中,经常会遇到需要判断对象是否具有某个属性的情况.这时候就可以用到Python内置函数 hasattr().本文将深入探讨 hasattr() 函数的使用方法及其在实际编程中的 ...
- hibernate-delete(Entity)的顺序问题
hibernate为我们提供了删除直接根据实体参数删除数据的方法: HibernateTemplate().delete(entity); public void delete(final Objec ...
- 【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
问题描述 在App Service For Linux 中,部署NodeJS应用,应用启动失败. 报错信息为: 2023-08-29T11:21:36.329731566Z RangeError: I ...
- Spring Boot+Thymeleaf+MyBatis--推荐一个后端练手极佳的商城项目
项目整体架构 newbee-mall ├── src/main/java └── ltd.newbee.mall ├── common // 存放相关的常量配置及枚举类 ├── config // 存 ...
- 在.Net中使用Java代码?
前言 你没有看错,我确实在.Net6的项目中在编写java,我都using java了,算不算在写java那? using com.microsoft.sqlserver.jdbc; using ja ...
- vue3页面使用vue2语法
vue3页面: import { getCurrentInstance } from 'vue'; const { proxy } = getCurrentInstance(); proxy...