小和问题

现有数组[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. [转贴]BLOCKED,WAITING,TIMED_WAITING有什么区别?-用生活的例子解释

    BLOCKED,WAITING,TIMED_WAITING有什么区别?-用生活的例子解释 https://www.jianshu.com/p/0976b2f23db1 https://dzone.co ...

  2. CS231N Assignment1 SVM 笔记

    svm.ipynb 为SVM实现一个完全矢量化的损失函数 为其解析梯度实现完全矢量化表达式 使用数值梯度检查实现结果 使用验证集调整学习率和正则化 使用 SGD 优化损失函数 可视化最终学习权重 第一 ...

  3. SignalR系列文章01---MVC项目中创建demo

    1.  新建mvc项目,引入指定的nuget包 2.  新增加一个集成器类添加如下的代码 /// <summary> /// 供客户端调用的服务器端代码 /// </summary& ...

  4. .netcore项目发布到IIS全流程

    一.环境准备 保证电脑上有.net core runtime下载地址:https://dotnet.microsoft.com/download/dotnet-core/current/runtime ...

  5. MySQL 列操作记录

    在 MySQL 中,你可以使用多种命令和语句来执行列操作,包括添加.修改.删除列等.以下是一些与列操作相关的常用 MySQL 命令和语句: 1. 添加列: 添加新列到表格中: ALTER TABLE ...

  6. easyui 使用不同的url以获取不同数据源信息

    转载 https://www.bbsmax.com/A/kjdw1x06JN/ https://blog.csdn.net/lixinhui199/article/details/50724081 参 ...

  7. 临上线项目使用ILRuntime热更

    前言 我们有一个用Unity引擎开发了二十个月的mmo arpg手游项目,在安卓已经测试三轮了,出于IOS的热的考虑且结合我们的情况:全部代码都是纯C#开发非Lua,所以计划使用ILRuntime热更 ...

  8. 深度学习应用篇-推荐系统[11]:推荐系统的组成、场景转化指标(pv点击率,uv点击率,曝光点击率)、用户数据指标等评价指标详解

    深度学习应用篇-推荐系统[11]:推荐系统的组成.场景转化指标(pv点击率,uv点击率,曝光点击率).用户数据指标等评价指标详解 1. 推荐系统介绍 在网络技术不断发展和电子商务规模不断扩大的背景下, ...

  9. Python 解析JSON实现主机管理

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示数据.JSON 是一种独立于编程语言的数据格式,因此在不同的编程语言中都有对 ...

  10. 19.10 Boost Asio 同步文件传输

    在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbye lyshark关键词来验证文件是否传输结束了,当然了这种传输方式明 ...