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日

相关文章

  • Java冒泡排序(Bubble Sort)实例讲解

    下面我将为你详细讲解“Java冒泡排序(Bubble Sort)实例讲解”的完整攻略。 1. 冒泡排序简介 冒泡排序(Bubble Sort)是一种简单且常见的排序算法。它通过重复地遍历待排序数组,每次遍历将两个相邻的元素进行比较,如果它们的顺序错误就交换它们的位置,直到没有需要交换的元素为止。 2. 冒泡排序Java实现 下面是一个Java实现冒泡排序的示…

    算法与数据结构 2023年5月19日
    00
  • C/C++实现八大排序算法汇总

    C/C++实现八大排序算法汇总 简介 本文旨在介绍常用的八大排序算法并用 C/C++ 语言实现。 八大排序算法包括: 冒泡排序(Bubble Sort) 插入排序(Insertion Sort) 选择排序(Selection Sort) 快速排序(Quick Sort) 归并排序(Merge Sort) 希尔排序(Shell Sort) 堆排序(Heap S…

    算法与数据结构 2023年5月19日
    00
  • 详解C++实现链表的排序算法

    详解C++实现链表的排序算法 算法介绍 链表是一种常见的数据结构,在实际使用中常常需要对链表进行排序。本文将介绍在C++中实现链表排序的几种算法,包括插入排序,归并排序和快速排序。 插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法。具体实现过程如下: 遍历链表,取下一个节点作为插入节点。 如果当前节点不小于插入节点,则将插入节点插入…

    算法与数据结构 2023年5月19日
    00
  • Python 数据结构之十大经典排序算法一文通关

    Python 数据结构之十大经典排序算法一文通关 一、前置知识 在学习本文之前,需要具备以下基础知识: Python 基础语法 算法与数据结构基础 二、十大经典排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 本文将一一讲解这十种排序算法。 三、冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历过要排…

    算法与数据结构 2023年5月19日
    00
  • Java实现单向链表的基本功能详解

    Java实现单向链表的基本功能详解 单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含存储数据的元素和一个指向下一个节点的指针。Java语言可以很方便地实现单向链表,本文将详细介绍Java实现单向链表的基本功能。 一、定义链表节点类 链表的基本单元是节点,我们需要定义一个节点类来描述它。节点类需要包含两个部分:存储数据的元素和指向下一个节点的指针…

    算法与数据结构 2023年5月19日
    00
  • 详解次小生成树以及相关的C++求解方法

    详解次小生成树以及相关的C++求解方法 什么是次小生成树 在普通的生成树中,每个节点只有一条边与其相连。而次小生成树则是指,在所有的生成树中,除了最小生成树之外,权值和第二小的生成树。 求解方法 Kruskal算法 Kruskal算法是一种贪心算法,也是求解最小生成树的常用算法。我们可以对Kruskal算法做一些修改,使其求出次小生成树。 一般情况下,我们需…

    算法与数据结构 2023年5月19日
    00
  • c++入门必学库函数sort的基本用法

    一、sort函数的基本介绍 sort()函数是C++ STL标准库提供的一种排序函数,能够对数组或容器进行排序。可以用于排序基本数据类型、结构体、对象等各种数据类型。其中,数组的排序时简单易行的,容器的排序则更加强大方便。 sort()的函数原型如下: template<class RandomAccessIterator> void sort(…

    算法与数据结构 2023年5月19日
    00
  • Python实现选择排序

    当我们需要对一个列表或数组进行排序时,选择排序是一种简单易懂的方法。Python是一种非常流行的编程语言,它可以轻松实现选择排序。 以下是Python实现选择排序的攻略: 选择排序的原理 选择排序是一种简单直观的排序算法,其基本思想是每次选择出最小的元素,放到已经排好序的部分的末尾。 实现步骤 找到未排序部分的最小元素; 将其放在已排序部分的末尾; 重复步骤…

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