【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) { // ...
随机推荐
- 信捷电气 - C++工程师面试题(社招:3-5年工作经验)
1. char i = 1; printf("%d",i); // char字节用printf以整数型打印出来 2. int (*a[10])int a[10]是函数指针数组 ...
- 通过 saltstack 批量更新 SSL 证书
哈喽大家好,我是咸鱼. 之前写过两篇关于 SSL 过期巡检脚本的文章: SSL 证书过期巡检脚本 SSL 证书过期巡检脚本(Python 版) 这两篇文章都是讲如何通过脚本去自动检测 SSL 过期时间 ...
- yum源配置脚本
# yum源配置脚本 #!/bin/bash mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bac ...
- linux下docker安装与初始
1 docker的安装与使用初识 1 docker的安装 # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persi ...
- Flask遇到的坑及解决办法
flask_script 在使用第三方包flask_script时,报一下错误 ModuleNotFoundError: No module named 'flask._compat' 问题时flas ...
- 【LeetCode栈与队列#02】有效括号
有效括号 力扣题目链接(opens new window) 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右 ...
- 有了这份Java面试中的葵花宝典,让你面试起飞!!!
HashMap面试题 HashMap与HashTable的区别 1.HashMap线程不安全 HashTable 线程是安全的采用synchronized 2.HashMap允许存放key 为null ...
- 06、etcd 写请求执行流程
本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢. 上一节我们学习了 etcd 读请求执行流程,这一节,我们来学习 etcd 写请求执行流程. 1.etcd写请求概览 etcd 一个写请求 ...
- 【Azure事件中心】使用Python SDK(Confluent)相关方法获取offset或lag时提示SSL相关错误
问题描述 使用Python SDK(Confluent)相关方法获取offset或lag时, 提示SSL相关错误, 是否有更清晰的实例以便参考呢? 问题解决 执行代码,因为一直连接不成功,所以检查 c ...
- C#系列文章索引
由于有读者说,是否可以讲C#一类的文章都统一在一起,因此我做了个索引文章置顶起来,以后C#相关文章也会同步更新到该索引文章下,以便查找 .Neter所应该彻底了解的委托 - RyzenAdorer - ...