| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构(六)- 快速排序(狠人)细细细 -> 正文阅读 |
|
[数据结构与算法]数据结构(六)- 快速排序(狠人)细细细 |
隶属于交换排序思想的快速排序,时间复杂度很顶。O(N*logN) 先说一下分类和整体思路,不然容易写迷糊了。 整个逻辑,先看下图!!! 先完成单趟排序 - 搞一个数1、hoare创始人版本 2、挖坑法 3、前后指针法 - 代码精简,逻辑严密 快排的单趟排序(一)hoare思想: 1、选一个关键字key,一般是可以是最左边的,也可以是最右边的 2、单趟排序以后的目标是:左边的值比key值小,右边的值比key大 3、此时key就是所落到的位置,不需要再动了,将数组分为左区间和右区间,整个数组就有序了。 ????????相遇位置: ????????最后相遇位置,这个值和key交换。 ????????为了保证相遇位置的值,满足交换之后,左边区间都是小于key,右边区间都是大于key。 ????????条件: ????????选择最左边的值做key,右边先走,左右相遇时比key小。 ????????选择最右边的值做key,左边先走,左右相遇时比key大。 ? ?
快排的单趟排序(二)- 挖坑法思想: 右边找小,放在左边的坑中,自己为坑 左边找大,放在右边的坑中,自己为坑 最后把key放进坑中。
?快排的单趟排序(三)- 前后指针法逻辑控制严密,首推 主要控制的思想就是 prev要么紧跟着cur,两者自己换自己,无所谓 要么prev紧跟着比key大的序列,将小的和大的换一下,达到左边是小的,右边是大的目的 ?注意左右两边做key,最后交换key和prev是不同的位置交换,建议画图理解。
第二步,完成整体排序 - 快排整个过程快排的递归实现可以借鉴二叉树的思想
递归都知道,有缺陷, 递归程序缺陷: 1、相比循环,性能差。(建立栈帧,早期优化不好,现在编译器优化很好,性能差不多) 2、核心问题,递归深度太深,导致栈溢出(或者没写循环条件 (属实自己问题)) 尤其是递归到最后几层的时候,每个区间数据很少,区间到时很多,影响快排效率,那么我们在最后几层的时候不调用递归排序了,使用一种小区间优化的思想。不用递归,用啥呢? 直接插入排序,选择排序,冒泡排序进行横向对比: 选择排序是最坏的排序算法,不管什么场景都是O(N^2) 直接插入和冒泡排序,最坏都是O(N^2),最好都是O(N)。 已经有序的数组,两者都一样好,对接近有序的数组,是直接插入最好。 小区间优化的快排
快排的缺陷,影响快排这个称号: ? 如何解决快排有序选key的问题? 1、随机选key。 2、三数去中 - 左边、右边、中间,去值为中间的数作为key。面对有序的情况,就能处理成最好情况。
好了,这下快排缺陷解决了,但是很烦人,递归这个东西能不调用就不调用,栈会溢出,所以还需要一个非递归实现 快排的非递归实现递归深度太深会导致栈溢出,所以使用非递归实现快排。主要思想就是,使用栈的思想代替递归时栈针的保存值。
结语:快排就是吊!!!用心文章(写这么多玩意) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/9 15:46:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |