【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) { // ...
随机推荐
- Innodb存储引擎的文件
目录 概述 参数文件 日志文件 错误日志 慢查询日志 查询日志 二进制日志 binary log 二进制日志的配置 二进制日志的作用 二进制日志的保存 socket 套接字文件 pid文件 MySQL ...
- 临时修改session日期格式冲突问题
输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' alter session set NLS_DATE_LANGUAGE ...
- 【Docker】.Net Core 结合Nlog集成ELK框架(Elasticsearch , Logstash, Kibana) (五)
之前有项目有用过ELK做过日志架构,不过是非docker形式安装的,今天来探究一下ELK的容器化技术 Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动 ...
- 《HelloGitHub》第 95 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- 【Azure 微服务】面对Service Fabric中节点状态不正常(Disabling/Warning/RemoveNode)的几种尝试解决方案
问题描述 发现 Service Fabric 的节点状态异常,如出现 Disabling, Warning,或者 RemoveNode的情况,并且持续很长时间都没有变化(2小时以上).如何来缓解这种问 ...
- STM32FATFS文件系统移植
STM32FATFS文件系统移植 1. FATFS简介 FATFS文件系统是一个用于在微控制器上运行的开源文件系统,支持FAT/FATFS.NTFS.exFAT等主流文件系统,且一直保持更新.在此以F ...
- 通过keil内置标准库创建stm32工程
通过keil内置标准库创建stm32工程.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkM ...
- 用图机器学习探索 A 股个股相关性变化
在本系列的前文 [1,2]中,我们介绍了如何使用 Python 语言图分析库 NetworkX [3] + Nebula Graph [4] 来进行<权力的游戏>中人物关系图谱分析. 在本 ...
- Java final 关键字使用
1 package com.bytezreo.finaltest; 2 3 /** 4 * 5 * @Description final 关键字使用 6 * @author Bytezero·zhen ...
- SPFA最短路
目录 从Bellman-Ford开始 核心思想 模拟算法执行过程 时间复杂度 模板 spfa spfa优化的思想 模板 从Bellman-Ford开始 对于所有边权都大于等于0的图,任意两个顶点之间的 ...