IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【排序算法】快速排序 -> 正文阅读

[数据结构与算法]【排序算法】快速排序

零、写在前面

  • CSDN21天学习挑战赛
  • 本人蒟蒻一枚,文章若有不足之处请大家批评指出,欢迎大家留言。

活动地址:CSDN21天学习挑战赛

一、排序算法

排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个关键字有序的序列。

二、快速排序

快速排序是一种分而治之思想在排序算法上的典型应用。
是对冒泡排序算法的一种改进。

1. 快速排序步骤

快速排序算法多次比较和交换来实现排序。需要通过基准将数据划分成两个部分,这两个部分也通过一个基准划分,一直到不可再分。

1.1 步骤
  1. 以第一个数组元素作为 “基准”(pivot)
  2. 遍历数组,将所有比基准的元素都移动到基准的边。遍历结束后所有比基准小的元素都在基准的左边,比基准大的都在基准的右边,基准所在的位置将组分为左右两个子数组。
  3. 递归地,将左右两子数组重复1.2.的步骤。

2. 代码实现

public static void main(String[] args) {
    int[] arr = {10, 9, 7, 19, 99, 24, 71, 2, 25, 31};
    int[] a = {2,8,7,1,3,5,6,4};
    quickSort(a, 0, a.length - 1);
    for (int data : a){
        System.out.print(data + " ");
    }
}

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

private static int partition(int[] arr, int left, int right) {
    // 设定基准值(pivot)
    int pivot = arr[left];
    int index = left + 1;
    for (int i = index; i <= right; i++) {
        if (arr[i] < pivot) {
            // 交换两个元素
            int tmp = arr[i];
            arr[i] = arr[index];
            arr[index] = tmp;
            index++;
        }
    }
    // 将基准值交换到对应位置
    arr[left] = arr[index - 1];
    arr[index - 1] = pivot;
    return index - 1;
}

3. 复杂度分析

3.1 时间复杂度

在平均状况下,排序 n 个元素的数组需要 Ο(nlogn) 次比较。
快速排序的最坏运行情况是 O(n2),比如有序时数列的快排,在待排序数据元素已经有序的情况下快速排序时间复杂度最高,退化成冒泡排序。

3.2 空间复杂度

由于使用到了递归,所以使用的空间就和递归的深度有关。
最好情况,每次数据元素都能平均的分成两个部分,得到完全二叉树的状态,空间复杂度O(logn)。
最坏情况,每次数据元素只能分成一个部分,仅只有左(右)子数,空间复杂度为O(n)。

3.3 练习题

215. 数组中的第K个最大元素

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:31:09  更:2022-08-19 19:31:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 19:19:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码