java 排序算法之快速排序

Java 排序算法之快速排序

快速排序(Quick Sort)是一种高效的排序算法,属于分治法(Divide and Conquer)策略,它的时间复杂度为 $O(nlogn)$,在大多数情况下可以达到线性级别的时间复杂度,是非常重要且常用的排序算法之一。

基本思想

快速排序算法的基本思路是:选择一个元素作为数组的 “基准”(pivot),将小于基准的元素放到它的左边,将大于基准的元素放到它的右边,然后再分别对基准的左半边和右半边进行递归操作。

算法步骤

  1. 首先需要选择一个基准元素(pivot),一般可以选择数组的第一个元素或最后一个元素作为基准元素。

  2. 将数组中小于基准元素的放到基准元素的左侧,大于基准元素的放到基准元素的右侧。

  3. 对基准元素左边的子数组和右边的子数组进行递归操作,直到子数组的长度为 1或0时,停止递归操作。

示例说明

示例 1

假设我们有一个整型数组:

int[] arr = { 5, 3, 8, 6, 2, 7, 1, 4 };

按照快速排序算法的步骤,我们首先需要选择一个基准元素。这里我们选择数组的第一个元素 5 作为基准元素。

为了方便演示,我们可以使用以下程序代码实现 partition:

public class QuickSort {

    public static void main(String[] args) {
        int[] arr = { 5, 3, 8, 6, 2, 7, 1, 4 };
        quickSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    private static int partition(int[] arr, int left, int right) {
        int i = left + 1, j = right;
        while (true) {
            while (i <= j && arr[i] < arr[left]) {
                i++;
            }
            while (i <= j && arr[j] > arr[left]) {
                j--;
            }
            if (i >= j) {
                break;
            }
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
        int temp = arr[left];
        arr[left] = arr[j];
        arr[j] = temp;
        return j;
    }

    private static void quickSort(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int p = partition(arr, left, right);
        quickSort(arr, left, p - 1);
        quickSort(arr, p + 1, right);
    }

}

在 partition 方法中,我们从数组的第 2 个元素开始向右查找,直到找到大于或等于基准元素的元素,同时从数组的最后一个元素开始向左查找,直到找到小于或等于基准元素的元素。如果找到了这样的情况,我们将两个元素交换。如果左右指针相遇,我们就跳出循环。最后我们将基准元素与左指针指向的元素交换。

在调用 quickSort 方法时,将数组和分别指向数组的起始位置和末尾位置的下标作为参数传递进去。在每次递归时,就根据基准元素的位置将数组分成两个子数组,然后分别对它们进行递归操作。

最终的输出结果为:

[1, 2, 3, 4, 5, 6, 7, 8]

示例 2

假设我们有一个字符串数组:

String[] arr = {"c", "a", "e", "b", "d"};

按照快速排序算法的步骤,我们首先需要选择一个基准元素。这里我们选择数组的第一个元素 c 作为基准元素。

为了方便演示,我们可以使用以下程序代码实现 partition:

public class QuickSort {

    public static void main(String[] args) {
        String[] arr = { "c", "a", "e", "b", "d" };
        quickSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    private static int partition(String[] arr, int left, int right) {
        int i = left + 1, j = right;
        while (true) {
            while (i <= j && arr[i].compareTo(arr[left]) < 0) {
                i++;
            }
            while (i <= j && arr[j].compareTo(arr[left]) > 0) {
                j--;
            }
            if (i >= j) {
                break;
            }
            String temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
        String temp = arr[left];
        arr[left] = arr[j];
        arr[j] = temp;
        return j;
    }

    private static void quickSort(String[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int p = partition(arr, left, right);
        quickSort(arr, left, p - 1);
        quickSort(arr, p + 1, right);
    }

}

在 partition 方法中,我们从数组的第 2 个元素开始向右查找,直到找到大于或等于基准元素的元素,同时从数组的最后一个元素开始向左查找,直到找到小于或等于基准元素的元素。如果找到了这样的情况,我们将两个元素交换。如果左右指针相遇,我们就跳出循环。最后我们将基准元素与左指针指向的元素交换。

在调用 quickSort 方法时,将数组和分别指向数组的起始位置和末尾位置的下标作为参数传递进去。在每次递归时,就根据基准元素的位置将数组分成两个子数组,然后分别对它们进行递归操作。

最终的输出结果为:

[a, b, c, d, e]

总结

快速排序算法是一种高效的排序算法,常用于实际生产环境中的排序任务。它的优势在于其时间复杂度和空间复杂度较低,在大多数情况下可以达到线性级别的时间复杂度

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

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 京东在数据挖掘方面对推荐技术的优化

    京东在数据挖掘方面对推荐技术的优化 京东是中国著名的电商平台,一直在推进自己的推荐系统技术,以提高用户交互体验和推广效果。在数据挖掘方面,京东对推荐技术进行了一系列的优化,包括以下几个方面: 1. 数据收集和处理 京东首先通过大数据技术收集和整理用户的行为数据,包括购买、浏览、评价等多个方面。同时利用机器学习技术进行数据建模,包括对用户画像、商品描述等方面的…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现快速排序(自已编写)

    下面是详细的讲解JavaScript实现快速排序的完整攻略。 1. 什么是快速排序? 快速排序是一种常用的排序算法,通过分割(partition)和递归分治的思想来快速排序一个数组,在平均情况下它的时间复杂度为 $O(n\log n)$,也是一种不稳定的排序方法。 2. 快速排序的实现过程 2.1 分割 对一个数组进行快速排序的过程就是先将其从中间分割成两部…

    算法与数据结构 2023年5月19日
    00
  • 逐步讲解快速排序算法及C#版的实现示例

    逐步讲解快速排序算法及C#版的实现示例 1. 快速排序算法简介 快速排序算法是一种高效的排序算法,它的时间复杂度为 $O(nlogn)$。它的基本思想是通过一次划分将原问题分解为两个子问题,再对子问题进行递归解决,最终得到排序结果。 2. 快速排序算法核心思想 快速排序算法的核心思想是选取一个基准元素,将待排序的序列分成两部分,一部分比基准元素小,一部分比基…

    算法与数据结构 2023年5月19日
    00
  • java ArrayList按照同一属性进行分组

    要按照同一属性进行分组,我们需要用到Java中的Collections类和Comparator接口。 首先,我们需要为ArrayList中的对象定义一个属性,以便按照该属性进行分组。例如,我们定义一个Person类,其中包含name和age两个属性,我们想要按照年龄进行分组。则代码如下: public class Person { private Strin…

    算法与数据结构 2023年5月19日
    00
  • java图搜索算法之图的对象化描述示例详解

    Java图搜索算法之图的对象化描述示例详解 什么是图? 图是一种非线性数据结构,由节点和边组成,节点表示图中对象,边表示节点间相互关系。图分为有向图和无向图,有向边和无向边。 图的对象化描述 Java中可以使用对象化的方式来描述一个图,主要有两个类: Vertex(节点类) 节点类表示图中的节点,主要有两个属性: label:节点标签,用于区分不同节点。 w…

    算法与数据结构 2023年5月19日
    00
  • Linux静态链接库使用类模板的快速排序算法

    下面是对“Linux静态链接库使用类模板的快速排序算法”的详细讲解。 简介 静态链接库是一种文件格式,其中包含了许多可共享的目标文件,这些目标文件可以在运行时被动态链接器加载。可以将静态链接库视为预编译的代码,包含在可执行程序中,因此在执行时无需加载库文件,从而提高程序的运行效率。 在Linux下,可以使用静态链接库的方式来实现类模板的快速排序算法,具有较高…

    算法与数据结构 2023年5月19日
    00
  • 如何利用Python动态展示排序算法

    首先,我们需要了解一下Python中常用的用于动态展示的库——matplotlib和pygame。 matplotlib是一个数据可视化库,它可以让我们轻松地创建各种静态和动态的图形,包括折线图、柱形图等等,而pygame则是一个开源的游戏开发库,它专用于创建游戏和动态图形。 接下来,我们就可以使用这两个库来展示排序算法了。 下面是一个示例,展示了如何使用m…

    算法与数据结构 2023年5月19日
    00
  • c语言实现的几种常用排序算法

    C语言实现的几种常用排序算法 简介 排序是算法中最基本的任务之一,其目的是将一系列元素按照一定的顺序进行排列。在实际开发中,排序算法被广泛应用,如数据分析、数据库查找等场景。在C语言中,有多种常用的排序算法,本文将详细介绍几种排序算法的实现方法。 冒泡排序(Bubble Sort) 冒泡排序是一种基本的排序算法,其原理是通过多次比较和交换来实现排序。其实现过…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部