十大排序之Quick Sort 快速排序

简介: 十大排序之Quick Sort 快速排序

Quick Sort 快速排序

快速排序(Quick Sort)是一种常用的排序算法,其思路如下:

  1. 选择一个元素作为基准(通常选择数组的第一个或最后一个元素)。
  2. 将数组分成两个子数组,小于基准的元素放在左边,大于基准的元素放在右边,基准元素放在两个子数组中间。
  3. 对左右两个子数组递归地进行步骤1和步骤2,直到子数组的长度为1或0,即已经有序。

以下是快速排序的具体步骤:

  1. 选择基准元素(例如选择第一个元素)。
  2. 使用双指针,一个指向数组的起始位置,一个指向数组的末尾位置。
  3. 将比基准元素小的元素移到左边,比基准元素大的元素移到右边,同时记录基准元素的最终位置。
  4. 递归地对左右两个子数组进行步骤1到步骤3,直到子数组的长度为1或0。

以下是快速排序的示例代码:

public class Sort {
    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(arr, low, high); // 获取基准元素的最终位置
            quickSort(arr, low, pivotIndex - 1); // 对左子数组进行递归排序
            quickSort(arr, pivotIndex + 1, high); // 对右子数组进行递归排序
        }
    }
    private static int partition(int[] arr, int low, int high) {
        int pivot = arr[low]; // 选择第一个元素作为基准
        int left = low + 1;
        int right = high;
        while (left <= right) {
            while (left <= right && arr[left] <= pivot) {
                left++;
            }
            while (left <= right && arr[right] > pivot) {
                right--;
            }
            if (left <= right) {
                swap(arr, left, right); // 交换左右指针所指向的元素
            }
        }
        swap(arr, low, right); // 将基准元素放置到最终位置
        return right;
    }
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    public static void main(String[] args) {
        int[] array = {5, 2, 8, 12, 1, 6};
        quickSort(array);
        System.out.println("排序结果:");
        for (int num : array) {
            System.out.print(num + " ");
        }
    }
}

快速排序的时间复杂度取决于基准的选择和数组的划分情况,最坏情况下为O(n^2),最好情况下可达到O(n log n)。

平均情况下,快速排序的时间复杂度为O(n log n)。

快速排序的空间复杂度为O(log n),因为递归调用需要使用额外的栈空间。

快速排序是一种原地排序算法,不需要额外的空间来存储临时数组。

相关文章
|
25天前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
16 1
|
1月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
46 9
|
25天前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
21 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
1月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
26 2
|
24天前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
29 0
|
29天前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
1月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
66 0
|
1月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
12天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
10天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。