| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> LY的数据结构复习———快速排序 -> 正文阅读 |
|
[数据结构与算法]LY的数据结构复习———快速排序 |
一种上课老师讲了没听懂的排序方法( 快排快排,可以说是相当的快了。具体实现的话弄懂也十分简单: 拿一个数组举例: a [] = {5,7,4,6,3,1,2,9,8} ?那么我们取第一个元素,将比它小的放在它的右边,将比他大的放在他的左边,即可得到: 那么怎么放有讲究嘛,这里我的写法是: 定义两个指针(两个数),一个指向数组开始,一个指向数组末尾 先将第一个元素也就是5拿出来: 那么这时第一个位置会产生一个空缺,拿谁来补,从后往前遍历,找到第一个比5小的数来补。 即数组末尾指针向前移动,找到比5小的数停止,并将该位置的数放到数组开头: 这时候右边又会产生一个空缺,拿谁补,从左边遍历,找到第一个比5大的数放在内个位置即可。 即开头的指针向后移动,找到比5大的数停止,并将该位置的数放到数组末尾指针的位置。 下一次又到从末尾指针开始找,找到后赋值给头指针,如此循环往复,知道两个指针碰头: ? ? ? ?这时我们将之前提出的5放在碰头的位置: ok,这一小步算是完成了。只要搞定这一步,剩下的就十分的简单了。 此时我们将数组分成了两个部分,即比五小和比五大,我们只需要利用递归的方式让左边的部分和右边的部分分别重复上述的过程即可。每一边结束的条件是只有一个元素或者无元素。 具体实现代码(菜鸡码风,轻喷:
?成功得到输出: 说完了算法,下面来考察时间复杂度(平均): 用一种不严谨的算法来算十分简单: 如果一个数组有8个元素,那么我们找一个元素可以将它分成两部分——左边4个右边4个(强调不严谨算法)继续分: 除去一开始的一共分了3层即log8层这么多,那么每层运算都要左指针从左遍历,右指针从右遍历,将这个数组完全遍历一遍也就是进行了8次访问。 这样看来快排的复杂度也显而易见了为O(nlogn) 相较于冒泡的n方而言快了不少,但同样存在最坏情况,如果我们采用上述办法来对一个逆序数组进行顺序排序的话,时间复杂度一样会来到O(n方),各位同学们可以自行模拟一下。 解决办法十分简单,即开始时在数组中随机选择一个数,让它与第一个数进行换位,继续上述方法即可,这样来做就无法刻意构建出一个最坏情况,从而大大提高此算法的稳定性。? ? ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/26 12:26:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |