Java 快速排序

快速排序(Quicksort)是一种高效的排序算法,采用分治法(Divide and Conquer)的策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。以下是用Java实现的快速排序算法:

复制代码
public class QuickSort {  
  
    // 主方法,用于测试快速排序  
    public static void main(String[] args) {  
        int[] array = {10, 7, 8, 9, 1, 5};  
        int n = array.length;  
  
        System.out.println("排序前的数组:");  
        printArray(array);  
  
        quickSort(array, 0, n-1);  
  
        System.out.println("排序后的数组:");  
        printArray(array);  
    }  
  
    // 快速排序方法  
    public static void quickSort(int[] array, int low, int high) {  
        if (low < high) {  
            // 找到分区点  
            int pi = partition(array, low, high);  
  
            // 递归地对左右子数组排序  
            quickSort(array, low, pi - 1);  
            quickSort(array, pi + 1, high);  
        }  
    }  
  
    // 分区方法  
    public static int partition(int[] array, int low, int high) {  
        int pivot = array[high];  // 选择最右边的元素作为枢轴  
        int i = (low - 1);  // i是较小元素的索引  
  
        for (int j = low; j < high; j++) {  
            // 如果当前元素小于或等于枢轴  
            if (array[j] <= pivot) {  
                i++;  
  
                // 交换array[i]和array[j]  
                int temp = array[i];  
                array[i] = array[j];  
                array[j] = temp;  
            }  
        }  
  
        // 交换array[i + 1]和array[high] (或枢轴)  
        int temp = array[i + 1];  
        array[i + 1] = array[high];  
        array[high] = temp;  
  
        return i + 1;  
    }  
  
    // 打印数组方法  
    public static void printArray(int[] array) {  
        int n = array.length;  
        for (int i = 0; i < n; ++i) {  
            System.out.print(array[i] + " ");  
        }  
        System.out.println();  
    }  
}

代码解释

  1. 主方法 (main) :
    • 创建一个数组并输出排序前的数组。
    • 调用 quickSort 方法对数组进行排序。
    • 输出排序后的数组。
  2. 快速排序方法 (quickSort) :
    • 如果 low 小于 high,则进行排序。
    • 调用 partition 方法获取分区点 pi
    • 递归地对分区点前后的子数组进行排序。
  3. 分区方法 (partition) :
    • 选择数组的最后一个元素作为枢轴。
    • 初始化较小元素的索引 i
    • 遍历数组,如果当前元素小于或等于枢轴,则交换 array[i]array[j]
    • 遍历完成后,将枢轴放到正确的位置(即 i + 1),并返回该位置。
  4. 打印数组方法 (printArray) :
    • 遍历数组并打印每个元素。

注意事项

  • 枢轴的选择可以优化,例如随机选择枢轴或选择数组的中间元素作为枢轴,以减少最坏情况(例如已经有序的数组)下的性能下降。
  • 快速排序的空间复杂度主要是递归调用栈,最坏情况下为 O(n),但平均情况下较好。
  • 快速排序的时间复杂度平均情况下为 O(n log n),最坏情况下为 O(n^2)。
相关推荐
再__努力1点7 分钟前
【76】Haar特征的Adaboost级联人脸检测全解析及python实现
开发语言·图像处理·人工智能·python·算法·计算机视觉·人脸检测
溟洵7 分钟前
【算法C++】链表(题目列表:两数相加、两两交换链表中的节点、重排链表、合并 K 个升序链表、K 个一组翻转链表7)
数据结构·c++·算法·链表
_OP_CHEN7 分钟前
【C++数据结构进阶】玩转并查集:从原理到实战,C++ 实现与高频面试题全解析
数据结构·c++·算法
gugugu.8 分钟前
算法:hot100---128. 最长连续序列
算法
天呐草莓13 分钟前
支持向量机(SVM)
人工智能·python·算法·机器学习·支持向量机·数据挖掘·数据分析
zore_c25 分钟前
【数据结构】队列——超详解!!!(包含队列的实现)
c语言·网络·数据结构·c++·笔记·算法·链表
小杰帅气27 分钟前
智能指针喵喵喵
开发语言·c++·算法
智驱力人工智能36 分钟前
守护生命的水上之眼 无人机人员落水检测系统的技术攻坚与应用实践 无人机溺水识别 山区水库无人机落水检测系统 水域安全无人机部署指南
大数据·人工智能·算法·安全·无人机·边缘计算
hweiyu0038 分钟前
排序算法选型决策树
算法·排序算法
蓝色汪洋3 小时前
xtu oj矩阵
算法