小和问题

现有数组[1,3,4,2,5]

1左边是0(小于1),所以1的小和为0

3左边是1(小于3),所以3的小和为1

4左边是1、3(均小于4),所以4的小和为1+3=4

2左边是1、3、4(只有1小于2),所以2的小和为1

5左边是1、3、4、2(均小于5),所以5的小和为1+3+4+2=10

数组的小和为0+1+4+1+10=16

上述方法是从“左边有几个数比当前数小”的角度去解决

还可以转化为“右边有几个数比当前数大”来解

现有数组[1,3,4,2,5]

1右边有4个数大于1,有4个小和(4);

3右边有2个数大于3,有2个小和(6);

4右边有1个数大于4,有1个小和(4);

2右边有1个数大于2,有1个小和(2);

5右边没有(0)

4+6+4+2+0=16

荷兰国旗问题

问题一

给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度0(1),时间复杂度O(N)

思路:

准备一个变量表示小于等于num的右边界【num定为5算了】

≤)[3,5,6,7,4,3,5,8]

i

此时有两种逻辑:

1、 当前数[i]≤num,则把当前的数[i]和小于等于区域"≤)"中的下一个数交换,然后"≤)"向右扩,i++;

2、当前数[i]>num,直接跳下一个数,i++;

≤)[3,5,6,7,4,3,5,8]

i

当指针来到3时,3≤5,区域"≤)"向右扩,i++

≤[3),5,6,7,4,3,5,8]

i
≤[3,5),6,7,4,3,5,8]

i

到5时同理

到6时满足第二种条件,直接跳下一个数,i++

≤[3,5),6,7,4,3,5,8]

i
≤[3,5),6,7,4,3,5,8]

i

到7时同理,直接跳下一个数,i++

到4时满足条件1,把4与"≤)"区域的下一个数交换,4与6交换,区域"≤)"向右扩,i++

≤[3,5),4,7,6,3,5,8]

i
≤[3,5,4),7,6,3,5,8]

i
≤[3,5,4),7,6,3,5,8]

i

以此类推,当区域"≤)"扩到整个数组范围时结束

问题二(荷兰国旗问题)

给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度0(1),时间复杂度0(N)

思路:

还是跟前一个问题类似,准备两个变量,一个表示小于5的右边界,另一个表示大于5的左边界

<)[3,5,6,3,4,5,2,6,9,0](>

i

此时每来到一个置就会有3种情况

1、当前数[i]<num,则把当前的数[i]和小于区域"<)"中的下一个数交换,然后"<)"向右扩,i++;

2、当前数[i]=num,,直接跳下一个数,i++;

3、当前数[i]>num,则把当前的数[i]和大于区域">)"中的前一个数交换,然后">)"向左扩,i++;

当指针来到3时,3<5,区域"<)"向右扩,i++

<[3),5,6,3,4,5,2,6,9,0](>

i
<[3),5,6,3,4,5,2,6,9,0](>

i

当指针来到5时,等于5,直接跳下一个

<[3),5,6,3,4,5,2,6,9,0](>

i
<[3),5,0,3,4,5,2,6,9,6](>

i
<[3),5,0,3,4,5,2,6,9,(6]>

i

当指针来到6时,6>5,6和大于区域">)"中的前一个数交换,6和0交换,i原地不动(因为还没检查过它)

此时,检查新交换到i位置的数,发现其<5,则0和小于区域"<)"中的下一个数交换,然后"<)"向右扩,i++;

<[3),5,0,3,4,5,2,6,9,(6]>

i
<[3),0,5,3,4,5,2,6,9,(6]>

i
<[3,0),5,3,4,5,2,6,9,(6]>

i

以此类推,当i遇到大于区域的边界时停止

最后两边就剩下大于小于的区域,而中间是等于的

结束

快排

1.0版

例如

现在有一个数组,拿数组的最后一个数作为划分值

然后让它前面的一段做到左边的为≤num,右边的为>num,设num为5吧

然后5和大于区域的第一个数做交换

然后再把圈上的区域再重复进行之前的操作(拿最后一个数作为划分值)

例如:

因为每次只保证一个数排好,所以递归到最后一定是有序的

2.0版

是以荷兰国旗问题为基础,也是最开始选数组的最后一个数作为划分值,不同的是,每次排完数组中间都是等于划分值的数,相当于每次搞定一批数的排序。

然后再在小于和大于区域重复上述操作直到排序结束

以5为例子

2.0和1.0在一些人为构建的数据中有可能会存在复杂度降低(好情况)或变高(坏情况)的情况

3.0版

在数组中随机选一个数作为划分值,将该数与数组最后一个数做交换再划分

由此,划分时出现好情况和坏情况就变成了概率事件,而且是等概率事件,因此该算法通过数学计算后的显示复杂度为O(Nlog2N)

【算法day3】小和、荷兰国旗、快排的更多相关文章

  1. 排序算法C语言实现——冒泡、快排、堆排对比

    对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...

  2. C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)

    算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...

  3. 在链表上实现 Partition 以及荷兰国旗问题

    在链表上实现 Partition 以及荷兰国旗问题 作者:Grey 原文地址: 博客园:在链表上实现 Partition 以及荷兰国旗问题 CSDN:在链表上实现 Partition 以及荷兰国旗问题 ...

  4. 荷兰国旗问题、快排以及BFPRT算法

    荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N). 这个问题 ...

  5. F#之旅4 - 小实践之快排

    参考文章:https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/posts/fvsc-quicksort.html F#之旅4 - 小 ...

  6. Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

    本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...

  7. 冒泡,快排算法之javascript初体验

    引子:javascript实际使用的排序算法在标准中没有定义,可能是冒泡或快排.不用数组原生的 sort() 方法来实现冒泡和快排. Part 1:冒泡排序(Bubble Sort) 原理:临近的两数 ...

  8. scala写算法-快排

    快排算法很经典,今天用scala的函数式思维来整理一下并实现: def qsort(list: List[Int]):List[Int]=list match { case Nil=>Nil c ...

  9. javascript高级排序算法之快速排序(快排)

    javascript高级排序算法之快速排序(快排)我们之前讨论了javascript基本排序算法 冒泡排序 选择排序 插入排序 简单复习: 冒泡排序: 比较相邻的两个元素,如果前一个比后一个大,则交换 ...

  10. 《算法导论》——重复元素的随机化快排Optimization For RandomizedQuickSort

    昨天讨论的随机化快排对有重复元素的数组会陷入无限循环.今天带来对其的优化,使其支持重复元素. 只需修改partition函数即可: int partition(int *numArray,int he ...

随机推荐

  1. [转帖]Cgroups资源限制

    https://cloud.tencent.com/developer/article/2108816?areaSource=105001.13&traceId=QzVtWN5jGl8zeYZ ...

  2. [转帖] Linux文本命令技巧(上)

    Linux文本命令技巧(上)   原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 前一篇我介绍了awk,这是一个全能的文本处理神器,因为它本身就是一门编程语言了 ...

  3. Nginx调优总结-第六部分编译优化与简单测试

    第六部分 编译优化 Nginx可以自行编译,所以里面可以设置多个编译策略. 也可以自行修改源码,便于比如进行ip_hash的全IP地址验证. 也可以修改nginx的版本号等信息, 避免内发现. 还可以 ...

  4. s-tui验证机器主频的过程

    摘要 小年在家陪孩子. 翻阅<企业存储技术>公众号的文章时 找到了 s-tui 进行监控机器主频的文章 感觉挺有用的 想验证一下 虚拟机有否支持Intel的睿频功能. 所以将之前写的pyt ...

  5. 阿里云ECS虚拟机磁盘扩容过程

    阿里云ECS虚拟机磁盘扩容过程 背景 公司同事将很早之前的一个虚拟机重新开机. 就好将一套demo环境安装进这个ECS虚拟机里面 这个机器系统盘只有40G的空间. 导致磁盘空间不足. 其实一开始我不知 ...

  6. Oracle 查看所有表大小的SQL

    Oracle 查看所有表大小的SQL 比较坑的是 lob 字段和 表的大小不在一个地方 为了出结果 我这边使用了 union all 慢的一逼... SELECT sum( tablesize ), ...

  7. # 继续前行github star突破8k即时通讯IM开源项目OpenIM版本发布计划

    项目简介 OpenIM继续领跑开源IM领域,在广大开发者的支持下,目前github star突破8k.在数据泄露.信息外泄.隐私滥用的时代,IM私有化部署需求旺盛.其中,政企协同办公对IM需求猛增,随 ...

  8. 【译】命名变得简单:AI 支持的重命名建议

    您是否曾经为命名一个变量.方法或类而挣扎过?找到表达性和简洁性之间的完美平衡了吗?您并不孤单.我们通过 GitHub Copilot Chat 扩展(需要订阅)在最新的 Visual Studio 预 ...

  9. 仅1cm厚!华硕发布全球最薄13.3英寸笔记本

    近日,华硕发布了新款Zenbook S 13 OLED,官方称其为世界最纤薄的13.3英寸OLED笔记本电脑. 据悉,这款电脑的厚度仅有1cm,重量也仅有1kg,相较其他同尺寸的笔记本,确实更加轻薄. ...

  10. uni-app接口请求封装

    首先根目录下新建文件夹取名随意,这里我取名common(意为:常见的.共有的) 然后新建request.js文件,贴入以下代码 let server_url = ''; //请求根路径(服务器地址) ...