Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >快速排序思想解决水桶问题

快速排序思想解决水桶问题

作者头像
李振
发布于 2021-11-26 06:58:13
发布于 2021-11-26 06:58:13
25800
代码可运行
举报
文章被收录于专栏:乱码李乱码李
运行总次数:0
代码可运行

水桶问题

假设给你n个红色的水壶和n个蓝色的水壶。它们的形状和尺寸都各不相同。所有的红色水壶盛水量都各不相同,蓝色水壶也是如此。但对于每一个红色水壶来说,都有一个蓝色水壶盛水量和其相同;反之亦然。 你的任务是配对出全部盛水量相同的红色水壶和蓝色水壶。为此,可以执行的操作为,挑出一对水壶,一只红色一只蓝色,将红色水壶灌满水,将红色水壶的水倒入蓝色水壶中,看其是否恰好灌满来判断,这个红色水壶的盛水量大于、小于或等于蓝色水壶。假设这样的比较需要花费一个单位时间。 请找出一种算法,它能够用最少的比较次数来确定所有水壶的配对。 注意:不可直接比较两个红色或者两个蓝色水壶,一次比较必须取一只红色一只蓝色。

解决方案

快速排序思想解

1.首先在集合中选取一个元素作为 「基准」 pivot 2.将集合中所有元素与「基准」元素进行对比,所有小于「基准」的元素,都移到「基准」的左边;所有大于「基准」的元素,都移到「基准」的右边。 3.对「基准」元素左右两边的集合,分别进行上述两步,直到所有的子集只剩下一个元素。

代码描述:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const quickSort = arr=> {
    if (arr.length <= 1) {
        return arr;
    }
    let pivotIndex = Math.floor(arr.length / 2);
    let pivot = arr.splice(pivotIndex, 1)[0];
    let left = [], right = [];
    for (let ai of arr) {
        if (ai < pivot) {
            left.push(ai);
        } else {
            right.push(ai);
        }
    }
    return quickSort(left).concat([pivot], quickSort(right));
};

水壶问题

1.依次从红色水壶中选取一个水壶与蓝色水壶集合对比,对比过程如下: 2.红色水壶与每一个蓝色水壶对比,盛水量大于红色水壶的蓝水壶放在右边,小于的放在左边,水量相等的为当前集合的 「基准」 元素。 3.如果当前集合中已有 「基准」 元素,则拿红色水壶与「基准」元素对比: 红色水壶大于基准元素,则选取基准元素右边的集合重复第二步; 如果红色水壶小于基准元素,则选取基准元素左边边的集合重复第二步。

举个栗子

现在有红色水壶容量为: [3, 5, 1, 4, 8, 2, 6] 蓝色水壶: [6, 2, 3, 1, 8, 5, 4]

第一步,选取红色水壶中第一个水壶 3 跟蓝色水壶依次对比,大于 3 的放右边,小于 3 的放左边,等于 3 的水壶为当前集合的 「基准」 元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[2, 1,, 6, 8, 5, 4]

然后选取红色水壶中的第二个水壶 5 与 「基准」 元素对比,5 > 3, 因此使用第一步的方法,拿 5 与 「基准」 元素右边的元素依次对比。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[2, 1,, 4,, 6, 8]

红色第三个水壶为 1, 拿 1 与第一个 「基准」 元素比较, 1 < 3, 因此使用第一步的方法, 拿 1 与 「基准」 元素左边的元素依次对比。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[, 2,, 4,, 6, 8]

红色第四个水壶为 4, 拿 4 与第一个 「基准」 元素比较, 4 > 3, 因此使用第一步的方法, 拿 4 与 「基准」 元素右边的元素依次对比。 右边元素集合中又有 「基准」 元素 5 ,因此先与 「基准」 元素对比, 4 < 5, 所以拿 4 与 「基准」 元素左边的元素依次对比。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[, 2,,,, 6, 8]

后面的顺序为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[, 2,,,, 6,]

[,,,,, 6,]

[,,,,,,]

代码描述:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'use strict';

Array.prototype.pivot = -1;
const quickMatch = (key, arr) => {
    if (arr.length <= 1) {
        console.log(`${key} matched!`);
        return;
    }
    if (arr.pivot < 0) {
        arr.left = new Array();
        arr.right = new Array();
        arr.map(ai=> {
            if (ai < key) {
                arr.left.push(ai);
            } else if (ai > key) {
                arr.right.push(ai);
            } else if (ai === key) {
                arr.pivot = key;
                console.log(`${key} matched!`)
            }
        });
    } else {
        if (key > arr.pivot) {
            quickMatch(key, arr.right);
        } else if (key < arr.pivot) {
            quickMatch(key, arr.left);
        }
    }
};

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let arrRed = [3, 5, 1, 4, 8, 2, 6];
let arrBlue = [6, 2, 3, 1, 8, 5, 4];

for (let key of arrRed) {
    quickMatch(key, arrBlue);
}

总结

这个算法有点类似于二叉树的思想,将红色水壶与蓝色水壶依次对比的时候,构建蓝色水壶二叉树,每个二叉树的根结点为红色水壶。平均时间复杂度为O(nlgn)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
漫画:什么是快速排序?(完整版)
同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。
小灰
2022/07/05
3250
漫画:什么是快速排序?(完整版)
快速排序的新用法
快速排序是一种高效的排序算法,利用分治的思想进行排序。它的基本原理是在待排序的n个数据中任取一个数据为分区标准,把所有小于该排序码的数据移到左边,把所有大于该排序码的数据移到右边,中间放所选记录,称之为一趟排序。然后,对前后两个子序列重复上述过程,直到所有记录都排好序。通俗点说,大致过程是对于一个无序序列,找到一个"哨兵数",将序列中所有比哨兵数小的数字都移在哨兵数的左边,所有比哨兵数大的数字都移在哨兵数的右边;然后分别对哨兵数左边和右边再使用同样的方法找到新的哨兵数,并再次进行分类,直到集合不可分割为止。
人不走空
2024/02/20
1230
一看就懂的快速排序
快速排序属于交换排序,主要步骤是使用基准元素进行比较,把小于基准元素的移动到一边,大于基准元素的移动到另一边。从而把数组分成两部分,然后再从这两部分中选取出基准元素,重复上面的步骤。过程如下:
Johnson木木
2019/11/24
4200
快速排序算法(quick sort)——较优的算法
快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。
一条晒干的咸鱼
2024/11/19
1410
快速排序算法(quick sort)——较优的算法
快速排序
快速排序是最效率极高的一种排序方法,正因为它效率高,所以也受到了面试官的青睐,同样成了程序员必会的内容。O(∩_∩)O哈哈~
kai666666
2020/10/17
3210
快速排序填坑口诀
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此在很多笔试面试中出现的几率很高。
KevinYan
2019/10/13
8180
【数据结构与算法】:选择排序与快速排序
在这里我们可以遍历一次同时找到最小元素和最大元素,对应放到相应的位置, 基本代码如下:
用户11029103
2024/03/19
3570
【数据结构与算法】:选择排序与快速排序
【Java数据结构和算法】012-排序:快速排序*、归并排序*、基数排序(桶排序)、堆排序、排序算法比较
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列;
訾博ZiBo
2025/01/06
850
【Java数据结构和算法】012-排序:快速排序*、归并排序*、基数排序(桶排序)、堆排序、排序算法比较
常用的排序算法之快速排序(Quick Sort)
快速排序是由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出的一种排序算法。它的基本思想是分治法(Divide and Conquer)的应用。
jack.yang
2025/04/05
1460
算法解析(挖坑法/快速排序)
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。它能对一定规范的输入,在有限时间内获得所要求的输出。算法的优劣可以用空间复杂度与时间复杂度来衡量。
一百减一是零
2024/07/25
970
快速排序(Quicksort)的Javascript实现
日本程序员norahiko,写了一个排序算法的动画演示,非常有趣。 这个周末,我就用它当做教材,好好学习了一下各种排序算法。 排序算法(Sorting algorithm)是计算机科学最古老、最基本的
ruanyf
2018/04/12
8050
快速排序(Quicksort)的Javascript实现
快速排序 : 调优:3亿数据40秒,2亿数据30秒,1亿数据15秒
上一章我们讲到并归排序,并归排序的重要思想是对大问题进行分解,解决分解出来的小问题达到解决大问题的效果
执生
2020/09/27
5190
快速排序-归并排序-堆排序
数组取标pivot,将小的元素放在pivot左边,大元素在右侧,然后依次对右边的子数组继续快排,以达到整个序列有序
Java架构师必看
2021/05/14
3420
【排序算法】 快速排序(快排)!图解+实现详解!
英国计算机科学家Tony Hoare在1960年为了解决计算机上的排序问题,提出了快速排序的算法,最初是为了在英国的英尔兰电子公司(ELLIOTT Brothers)的快速硬件上实现高效的排序算法。
屿小夏
2024/01/22
30.7K0
【排序算法】 快速排序(快排)!图解+实现详解!
JS手撕(十一) 选择排序、快速排序
只需要遍历寻找最小的数,并保存最小数的索引。遍历完之后,让最小数和已排序序列的末尾互换位置即可。
赤蓝紫
2023/01/01
2.4K0
JS手撕(十一) 选择排序、快速排序
阮一峰快速排序
本打算学一波快速排序,查了查资料,吓一大跳,说阮一峰大神的快排是不对的,以此开始了一大波大神针对这个问题的各种观点。感兴趣的可以看看知乎这篇帖子:
wade
2020/04/24
1.1K0
【算法】快速排序及优化
其实,这就是快排的partition过程,通过三个指针,index,less,more进行的,初始less=左边界-1,more=右边界+1,说明一开始不存在less域和more域: 1)若arr[index] < num,less域增加,即less++,然后index和less位置的数交换后,index++继续指向下一个数 2)若arr[index] > num,more域增加,即more++,然后index和more的数交换后,继续判断交换后arr[index]和num的关系 3)若arr[index] == num,index++继续指向下一个数,不坐任何处理 4)重复以上过程,直至index==more
MapleYe
2020/03/28
4320
算法学习:快速排序
这是算法流程的起点,从数列中精心挑选出一个元素,赋予它一个特殊角色——“基准”(pivot)。基准的选择可以很灵活,但理想情况下应倾向于选择一个能将数据集大致均匀分割的值,以促进算法效率。
空白诗
2024/06/14
1550
算法学习:快速排序
手敲一遍数据结构和排序算法 Java
​ 不管元素在什么情况下都要做这些步骤,所以花销的时间是不变的,所以该算法的最优时间复杂度和最差时间复杂度及平均时间复杂度都是一样的为:O( nlogn )
小锋学长生活大爆炸
2022/03/29
4430
手敲一遍数据结构和排序算法 Java
Qz学算法-数据结构篇(排序算法--快速、归并)
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
浅辄
2023/06/19
2060
相关推荐
漫画:什么是快速排序?(完整版)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验