JAVA算法起步之快速排序实例

JAVA算法起步之快速排序实例

什么是快速排序

快速排序是一种十分高效的排序算法,采用分治的策略,对于数据量大的随机数组,快速排序是目前已知的最快的排序算法之一。它的基本思路是:通过一趟排序将待排序列分成两部分,一部分比基准元素小,一部分比基准元素大,然后再递归地对这个两部分进行快速排序,以达到整个序列有序的目的。

快速排序的基本步骤

  1. 从数列中挑出一个元素,称为 "基准"(pivot);
  2. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的摆在基准后面(相同的数可以摆放到任一侧),在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值的子数列排序。

实现快速排序

快速排序的算法实现代码:

class QuickSort { 
    /* 
     * 快速排序方法:对数组array进行快速排序 
     * 参数说明: 
     *     array -- 待排序的数组 
     *     left  -- 数组的左边界(例如,从起始位置开始排序,则l=0) 
     *     right -- 数组的右边界(例如,排序截止到数组末尾,则r=array.length-1) 
     */ 
    public static void quickSort(int[] array, int left, int right) { 
        if(left < right) { 
            int i,j,x;
            i = left; 
            j = right; 
            x = array[i]; 
            while (i<j) { 
                while(i<j && array[j]>x) 
                    j--; 
                if(i<j) 
                    array[i++] = array[j]; 
                while(i<j && array[i]<x) 
                    i++; 
                if(i<j) 
                    array[j--] = array[i]; 
            } 
            array[i] = x; 
            quickSort(array,left,i-1); /* 递归调用 */ 
            quickSort(array,i+1,right);/* 递归调用 */ 
        } 
    } 

    public static void main(String[] args) { 
        int i; 
        int[] a = {30,40,60,10,20,100,90}; 
        long startTime = System.currentTimeMillis();/* 排序前取得当前时间 */ 

        quickSort(a,0,a.length-1); 

        long endTime = System.currentTimeMillis();/* 排序后取得当前时间 */ 
        System.out.println("排序时间: "+(endTime-startTime)+"ms"); 

        for(i=0; i<a.length; i++) 
            System.out.printf("%d ",a[i]); 
    } 
} 

实例分析1

例如,我们有一个包含10个元素的数组,待排序的数组为{49, 38, 65, 97, 76, 13, 27, 50, 2, 8},每一次排序的过程如下所示:

第一次排序

初始序列:49, 38, 65, 97, 76, 13, 27, 50, 2, 8

选择第一个元素49作为基准,将大于49的元素放在右边,小于49的元素放在左边:

27, 38, 13, 2, 8, 49, 65, 97, 76, 50

左侧序列为27,38,13,2,8,右侧序列为65,97,76,50,分别对两个子序列进行递归排序。

第二次排序

左侧序列:27, 38, 13, 2, 8

选择第一个元素27作为基准,将大于27的元素放在右边,小于27的元素放在左边:

2, 8, 13, 27, 38

左侧序列为2,8,13,右侧序列为空,递归结束。

右侧序列:65, 97, 76, 50

选择第一个元素65作为基准,将大于65的元素放在右边,小于65的元素放在左边:

50, 65, 76, 97

左侧序列为50,右侧序列为76,97,分别对两个子序列进行递归排序。

第三次排序

左侧序列:50

左侧序列只有一个元素50,不需要排序,递归结束。

右侧序列:76, 97

选择第一个元素76作为基准,将大于76的元素放在右边,小于76的元素放在左边:

50, 65, 76, 97

左子序列为50,65,右子序列为97。

第四次排序

左侧序列:50, 65

左侧序列为50, 65,不需要排序,递归结束。

右侧序列:97

右侧序列只有一个元素97,不需要排序,递归结束。

最终排序结果:2,8,13,27,38,49,50,65,76,97。

实例分析2

例如,我们有一个包含10个元素的数组,待排序的数组为{3,2,1,5,4,6,8,7,9,10},每一次排序的过程如下所示:

第一次排序

初始序列:3,2,1,5,4,6,8,7,9,10

选择第一个元素3作为基准,将大于3的元素放在右边,小于3的元素放在左边:

2, 1, 3, 5, 4, 6, 8, 7, 9, 10

左侧序列为2,1,右侧序列为5,4,6,8,7,9,10,分别对两个子序列进行递归排序。

第二次排序

左侧序列:2,1

选择第一个元素2作为基准,将大于2的元素放在右边,小于2的元素放在左边:

1, 2, 3, 5, 4, 6, 8, 7, 9, 10

左侧序列为1,右侧序列为3,5,4,6,8,7,9,10,分别对两个子序列进行递归排序。

第三次排序

左侧序列:1

左侧序列只有一个元素1,不需要排序,递归结束。

右侧序列:3,5,4,6,8,7,9,10

选择第一个元素3作为基准,将大于3的元素放在右边,小于3的元素放在左边:

1, 2, 3, 5, 4, 6, 8, 7, 9, 10

左子序列为4,右子序列为5,6,8,7,9,10。

第四次排序

左侧序列:4

左侧序列只有一个元素4,不需要排序,递归结束。

右侧序列:5,6,8,7,9,10

选择第一个元素5作为基准,将大于5的元素放在右边,小于5的元素放在左边:

1, 2, 3, 4, 5, 6, 8, 7, 9, 10

左子序列为7,右子序列为6,8,9,10。

第五次排序

左侧序列:7

左侧序列只有一个元素7,不需要排序,递归结束。

右侧序列:6,8,9,10

选择第一个元素6作为基准,将大于6的元素放在右边,小于6的元素放在左边:

1, 2, 3, 4, 5, 6, 8, 9, 10, 7

左子序列为8,9,10,右子序列为空。

第六次排序

左侧序列:8,9,10

左侧序列为8,9,10,不需要排序,递归结束。

右侧序列:空序列

右侧序列为空序列,不需要排序,递归结束。

最终排序结果:1,2,3,4,5,6,7,8,9,10。

总结

快速排序是一个非常高效的排序算法,由于其采用分治思想,不断地递归执行快速排序,因此也是一个非常经典的算法。在实际应用中,快速排序的时间复杂度较低,因此被广泛应用于大规模数据的排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA算法起步之快速排序实例 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • JavaWeb中文编码问题实例讲解

    JavaWeb中文编码问题实例讲解 什么是中文编码问题 中文编码问题是指,在JavaWeb应用中,由于不同的编码方式和不同的环境配置,导致在数据传输和存储过程中出现乱码等问题。 常见的中文编码方式 常见的中文编码方式有UTF-8、GBK、GB2312等。 解决中文编码问题的方法 设置Tomcat服务器的URIEncoding和useBodyEncodingF…

    Java 2023年5月20日
    00
  • java多线程编程之捕获子线程异常示例

    首先让我们来分析一下“java多线程编程之捕获子线程异常示例”的内容意义: 在Java多线程编程中,子线程中抛出未处理的异常会导致整个程序崩溃。在生产环境中,这种意外崩溃的情况会给用户带来极差的体验。因此,如果我们能够有效地捕获子线程中的异常,并对其进行处理,是非常有必要的。 接下来,我将通过两个具体的示例,向大家详细讲解如何捕获子线程异常以及如何对其进行处…

    Java 2023年5月19日
    00
  • 一篇文章带你入门java集合

    一篇文章带你入门Java集合 Java集合是Java编程中常用的数据结构,包含了List、Set、Map等常用的集合类型。本文将从以下几个方面介绍Java集合: Java集合的类型和概念 Java集合的基础用法 Java集合的注意事项 1. Java集合的类型和概念 集合类型 Java集合主要有以下三种类型: List(列表):有序,可以重复,例如Array…

    Java 2023年5月26日
    00
  • 通过Java实现文件断点续传功能

    关于“通过Java实现文件断点续传功能”的攻略,我整理了以下步骤: 一、概述 在进行大文件的上传或下载时,考虑到网络环境以及其他因素,导致可能会出现网络中断、程序崩溃等情况,从而造成上传或下载任务无法完成。为了保证文件上传或下载任务不会因为因为网络等问题进行重头开始,可以通过实现文件的断点续传功能来解决这个问题。文件的断点续传功能可以实现将文件分成多个块,每…

    Java 2023年5月31日
    00
  • java整数(秒数)转换为时分秒格式的示例

    让我来详细讲解一下如何将 Java 中的整数(秒数)转换为时分秒格式。 思路分析 将秒数转换为时分秒格式,其实就是将秒数拆分为小时、分钟、秒三个部分,然后格式化输出。可以使用 Java 中的数学运算和字符串格式化实现。 具体操作如下: 计算出总秒数中包含的小时数、分钟数和秒数; 使用字符串格式化输出结果。 代码实现 下面是整数(秒数)转换为时分秒格式的示例代…

    Java 2023年5月20日
    00
  • 详解Java的位操作符

    详解Java的位操作符 在Java编程中,位操作符是十分重要的操作符之一。它可以对数字进行位运算,通过改变二进制数的位来实现一些比较复杂的操作。本文将详细讲解Java的位操作符。 按位与(&)操作符 按位与操作符”&”主要用于对二进制数进行与运算。如果两个位都是1,那么结果就是1,否则结果就是0。下面是一个示例: int a = 6; int…

    Java 2023年5月26日
    00
  • 浅谈maven的jar包和war包区别 以及打包方法

    下面就是关于“浅谈maven的jar包和war包区别 以及打包方法”的完整攻略。 什么是Maven Maven是一个Java项目的自动化构建工具,可以帮助我们自动化地完成项目构建、打包、依赖管理等工作。 jar包和war包的区别 Maven中的jar包和war包是两种不同的打包方式。jar包是Java程序的一种标准的JAR文件格式,一般用于打包Java类库、…

    Java 2023年5月20日
    00
  • JAVA中正则表达式匹配,替换,查找,切割的方法

    在Java中,可以使用正则表达式进行字符串匹配,替换,查找和切割等操作。使用正则表达式需要使用Java.util.regex包中的类。 正则表达式基本语法 正则表达式是一种特殊的字符串,可以用于描述匹配一个字符串的规则。正则表达式的基本语法如下: 1. 字符串 表示要匹配的字符串,例如 abc。 2. 字符集 表示可以匹配的字符集合,例如 [abc] 表示可…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部