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日

相关文章

  • 详解Java的位操作符

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

    Java 2023年5月26日
    00
  • SpringBoot yaml语法与JRS303校验超详细讲解

    下面我就给你介绍一下Spring Boot中的yaml语法和JRS303校验的全面攻略。 一、Spring Boot yaml语法 1.1 简介 在Spring Boot项目中,我们可以通过yaml语法来配置项目相关信息。yaml是一种人类可读的数据序列化格式,而且在Spring Boot中默认使用了yaml作为配置文件的语法。相比于xml和properti…

    Java 2023年5月19日
    00
  • java内部类的最详细详解

    Java内部类的最详细详解 什么是Java内部类 在Java中,内部类是一个定义在其他类中的类,这个类可以访问其外部类的所有成员和方法。Java中内部类的分类有四种:成员内部类、局部内部类、匿名内部类和静态内部类。 成员内部类 成员内部类是定义在类的内部,且与类的成员变量和方法处于同一等级的类。成员内部类可以访问外部类的所有成员变量和方法,包括私有成员。成员…

    Java 2023年5月26日
    00
  • Java JTable 实现日历的示例

    这里提供一个Java JTable 实现日历的示例的完整攻略: 1. 实现一个基本的日历 步骤一:创建一个 JFrame,并添加一个 JTable,用来显示日历 public class Calendar extends JFrame { private final int WIDTH = 600; private final int HEIGHT = 40…

    Java 2023年5月20日
    00
  • Java命令行运行错误之找不到或无法加载主类问题的解决方法

    当我们使用Java命令行运行程序时,有时候会出现“找不到或无法加载主类”的错误,这是因为Java虚拟机无法找到程序的入口点。下面是解决这个问题的完整攻略。 1. 检查CLASSPATH环境变量是否设置正确 Java程序运行时需要读取CLASSPATH环境变量来查找类文件。如果该变量设置错误,就会导致找不到或无法加载主类的错误。因此,我们可以通过以下命令来检查…

    Java 2023年5月26日
    00
  • internal修饰符探索kotlin可见性控制详解

    首先,让我们来探讨一下“internal”修饰符在Kotlin可见性控制中的作用。 Kotlin中,可见性分为public、private、protected和internal四种级别。其中,internal修饰符表示该成员仅对模块内可见。也就是说,同一模块中的所有代码都可以访问被internal修饰的成员,但是对于其他模块的代码来说则是不可见的。 举个例子…

    Java 2023年5月26日
    00
  • Java中String.format的使用方法总结

    Java中String.format的使用方法总结 作为Java程序员来说,我们用到String.format的场景很多,今天我们就来总结一下它的使用方法。 1. 格式化字符串 String.format方法可以用来格式化字符串。以下是一个简单的例子: String message = String.format("Hello, %s! Today…

    Java 2023年5月26日
    00
  • SpringMVC MVC架构原理及实现方法详解

    以下是关于“SpringMVC MVC架构原理及实现方法详解”的完整攻略,其中包含两个示例。 SpringMVC MVC架构原理及实现方法详解 SpringMVC是一个基于MVC模式的Web框架,它提供了一种灵活、高效的方式来开发Web应用程序。在SpringMVC中,MVC是如何实现的?下面我们来详细讲解。 MVC架构原理 MVC是Model-View-C…

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