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日

相关文章

  • TypeScript调整数组元素顺序算法

    下面是详细的攻略: TypeScript调整数组元素顺序算法 在 TypeScript 中实现调整数组元素顺序的算法需要使用到以下两种方法: 方法一:splice() array.splice(startIndex, toRemove, …itemsToAdd) splice() 方法可以实现对数组中指定起始索引 startIndex 开始的若干元素的删…

    算法与数据结构 2023年5月19日
    00
  • C语言对数组元素进行冒泡排序的实现

    冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数组,每次比较相邻的元素,如果顺序不对就交换元素。通过多次遍历来实现排序。 下面是C语言进行数组元素冒泡排序的具体实现过程: 实现步骤 首先确定要排序的数组以及数组的大小。比如说,我们要对包含10个整数的数组进行排序,可以将其定义为 int a[10] = {1,2,3,4,5,6,…

    算法与数据结构 2023年5月19日
    00
  • 合并排序(C语言实现)

    合并排序(C语言实现) 合并排序是一种将待排序序列分成多个子序列,分别进行排序,然后再将排序后的子序列合并成整体有序序列的排序算法。使用递归实现时,该算法的时间复杂度为O(nlogn),因此被广泛应用。 实现步骤 合并排序可以用以下步骤来实现: 分治:将待排序序列从中间分成两部分,递归地对左右两部分进行排序。 合并:将两个有序子序列合并成一个有序序列。 在实…

    算法与数据结构 2023年5月19日
    00
  • c语言实现基数排序解析及代码示例

    c语言实现基数排序解析及代码示例 前言 基数排序是一种特殊的排序算法,它的时间复杂度为O(dn),其中d表示数据位数,n表示数据个数。它可以用于排序整数、字符串、链表等数据类型。本篇攻略通过讲解基数排序的原理、流程和C语言实现,希望能够帮助大家更好地理解和应用基数排序算法。 基数排序原理 基数排序是一种非比较排序算法,它的实现基于按照键值的每位数字对待排序数…

    算法与数据结构 2023年5月19日
    00
  • C语言简单实现快速排序

    C语言简单实现快速排序 什么是快速排序? 快速排序(Quicksort)是一种分治的排序算法,由Tony Hoare于1960年提出。快速排序使用两个指针i,j分别指向待排序数组的最左侧和最右侧,以一个值作为基准(pivot),一般为数组的中间值。快速排序的主要思路是将数组中小于基准值的数放到基准值左边,将大于基准值的数放到右边。然后通过递归的方式,对左右两…

    算法与数据结构 2023年5月19日
    00
  • 堆排序原理及算法代码详解

    堆排序原理及算法代码详解 堆排序属于一种选择排序,它的基本思想是利用堆这种数据结构来进行排序。 堆的概念 堆(Heap)是一个特殊的树形数据结构,它有以下两种类型: 大根堆:每个节点的值都大于或等于其左右孩子节点的值。 小根堆:每个节点的值都小于或等于其左右孩子节点的值。 通过对堆进行操作,可以得到堆排序算法。 堆排序的基本思想 将待排序序列构造成一个大根堆…

    算法与数据结构 2023年5月19日
    00
  • PHP面试常用算法(推荐)

    对于“PHP面试常用算法(推荐)”这一话题,我可以给出一个较为完整的攻略,如下: PHP面试常用算法(推荐) 1.算法的定义 算法(Algorithm)是指解决问题的方法和步骤,也就是解决问题的具体步骤和策略。算法包括很多种,比如常见的排序算法、查找算法、递归算法等等。在 PHP 的面试中,算法是一个非常重要的考察内容,因此熟练掌握各种算法的基本原理和实现方…

    算法与数据结构 2023年5月19日
    00
  • Trie树_字典树(字符串排序)简介及实现

    接下来我将详细讲解“Trie树_字典树(字符串排序)简介及实现”的完整攻略。 什么是 Trie 树? Trie 树,也叫字典树,是一种树形数据结构,用于处理字符串匹配、排序等问题。它的特点是能够快速地查找特定前缀或后缀的字符串。 Trie 树的基本实现 Trie 树通常是一棵多叉树,其中根节点不包含任何字符,每个子节点包含一个字符,组成一个完整的字符串。下面…

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