Java中常见的排序方式-快速排序(升序)

【基本思想】

快速排序在元素较多的情况下,排序效率是相当高的。其基本思想是这样:

假设数组为int[] arr = { 49, 38, 65, 97, 76, 13, 27, 22, 26, 41, 13, 17, 32 },数组元素个数为13个。

选定a[0]为left标记,a[12]为right标记,基准点pivot的初始位置一般也为a[0](其值记为p)。

定义i,j分别代表了不断变化的left和right标记。

此时,先让基准点归位。即以p为基准,左侧元素均小于p,右侧元素均大于p。

具体即为:

1.左标记不断右移,比较p与所在位置元素的大小,若比p大,停止比较,记下此点;

2.右标记不断左移,比较p与所在位置元素的大小,若比p小,停止比较,记下此点;

3.交换左右标记;

4.直至左右标记重合,这个位置就是基准点的位置。

然后被基准点分开的这两小段序列重复上述步骤。

【代码实现】

    public static void quickSort(int[] arr, int left, int right) {
        // 如果left不小于right,需要排序的部分只有一个元素,方法结束调用。
        if (left >= right) {
            return;
        }
        // 将最左侧的元素设置为pivot(基准点)
        int p = arr[left];
        // 把比p小的放到左边,比p大的放到右边。
        int i = left, j = right;
        while (i < j) {
            // j向左移,找到一个比p小的元素。
            while (arr[j] >= p && i < j) {
                j--;
            }
            // i向右移,找到一个比p大的元素。
            while (arr[i] <= p && i < j) {
                i++;
            }
            // i和j交换。
            if (i < j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        // 让基准点归位,此时i与j是相同的,用谁都行。
        arr[left] = arr[i];
        arr[i] = p;
        // 基准点左侧序列的元素递归进行快速排序。
        quickSort(arr, left, i - 1);
        // 基准点右侧序列的元素递归进行快速排序。
        quickSort(arr, i + 1, right);
    }

原文地址:https://www.cnblogs.com/schiller-hu/p/8439619.html

时间: 2024-10-17 14:21:09

Java中常见的排序方式-快速排序(升序)的相关文章

Java中常见的排序方式-选择排序(升序)

[基本思想] 假设数组为int[] a = { 49, 38, 65, 97, 76, 13, 27 },数组元素个数为7个. 第1轮比较:先是a[0]与a[1]比较,大于则先交换,再比较a[0]和a[2]......最后是a[0]与a[6]比较.总共比较6次.(此时a[0]已是数组中的最小值) 第2轮比较:先是a[1]与a[2]比较,大于则先交换,再比较a[1]和a[3]......最后是a[1]与a[6]比较.总共比较5次. 第3轮比较:先是a[2]与a[3]比较,大于则先交换,再比较a[2

Java 中常见的排序算法

  其实小编是不太想写关于java的相关文章,因为是这个编程语言实在是会用的人太多了,网上的博文数不胜数,没必要在重复造轮子了,但是虽然java这门语言会用的人很多,但是会用.掌握.熟练.和精通可不是闹着玩的,想要达到精通的级别,小编敢说,一个正规的开发公司能过达到精通java的开发人员屈指可数,所以小编这里就跳过关于java哪些简单的API .语法,直接给大家介绍一些相对提升能力,并且不是那么基础的知识,说不定以后面试就会用到,尤其是排序,真的,不晓得为啥都喜欢在面试的时候出排序的题,实际大数

Java中常见的排序算法

这是我摘取的一段英文资料,我觉得学习算法之前,对各种排序得有个大致的了解: Sorting algorithms are an important part of managing data. At Cprogramming.com, we offer tutorials for understanding the most important and common sorting techniques. Each algorithm has particular strengths and w

使用jdk中提供的排序方式

package com.bjpowernode.t01; import java.util.Arrays; /** * 使用jdk中提供的排序方式 * */public class TestArray11 { public static void main(String[] args) { int[] a = {4,2,7,3,6}; //对数组进行排序 Arrays.sort(a); //升序输出// for(int i=0; i<a.length; i++) {// System.out.p

Java中常见的5种WEB服务器介绍

这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomc

为什么Java中实现多线程的方式有两种?

在面试的过程中,我们经常问被面试者,为什么Java中实现多线程的方式有两种(一种是直接继承Thread类,一种是实现Runnable接口)?可惜的是,很多面试者都答不出来,甚至从来没有想为什么.,那么真正的原因是什么呢?我们可以用反证法推理一下: 假设Java只提供Thread供大家继承从而实现多线程,考虑下面的一个需求,如果有一个已经继承了某个父类的类,但是这个类又想实现多线程,怎么办?很显然,如果只提供一个可以继承的类,肯定解决不了这个问题.那么,如何解决,毫无疑问,就只能使用接口了.

java中常见的输入输出流案例学习

字节输入流: 1.FileInputStream 用途:从文件系统中的文件获得输入字节,常用于读取图像.声音等原始字节流,读取字符流可考虑使用FileReader 详细构造函数与常用方法可参考API文档,网上已经有中文版的API了,我是个E文盲,伤不起 这里介绍一个最常见的方法: read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中. ->off:b字节数组中的偏移量 小知识:数组偏移量,比如a[1,2,3,4,5]

JS 和 Java 中URL特殊字符编码方式

前几天遇到url特殊字符编码的问题,在这里整理一下: JavaScript 1.  编码 escape(String) 其中某些字符被替换成了十六进制的转义序列. 解码 unescape(String) 该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码. *注释:ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decode

Java中常见的设计模式

我在这里稍微总结一下Java中常见的一些设计模式. 1,单例设计模式 单例设计是Java中最常见的模式之一,,它就是要保证程序里边只有一个对象实例.就好比班上都叫他为班长,是因为得保证班上只有一个班长. 单例设计模式的程序设计思想反应的是Java面向对象思想的封装特性.就是为了保证只有一个对象实例,我们私有化它的构造函数,对外只提供一些相关的 公共方法来获得对象实例. 单例设计模式的实现主要分为饿汉式和懒汉式 饿汉式是先对类的对象实例化,随着类的加载对象也加载进来缺点是会造成性能的损耗好处是实现