• 问题描述:假设我们有n个直径各不相同的螺钉以及n个相应的螺母。我们一次只能比较一对螺钉和螺母,来判断螺母是大于螺钉、小于螺钉还是正好适合螺钉。然而,我们不能拿两个螺母做比较,也不能拿两个螺钉做比较。我们的问题是要找到每一对匹配的螺钉和螺母。为该问题设计一个算法,它的平均效率必须属于集合O(n*logn)。

通常来说,看到平均效率O(n*logn),一般都会想到是快速排序。
如果有不会快速排序的可以看上一篇文章 点击这里跳转。

  • 知道用快速排序,但是应该如何实现呢?本文来讲解一下up主的思路:

首先把螺母定义为Nut数组[6, 8, 1, 2, 9, 3, 7],螺钉定义为Screw数组[9, 3, 7, 1, 6, 2, 8];
螺母(Nut) 排序前:[6, 8, 1, 2, 9, 3, 7]
螺钉(Screw)排序前:[9, 3, 7, 1, 6, 2, 8]

  1. 首先从螺母(Nut)中随机取一个数(默认第一个元素 6 ),以该数作为螺钉(Screw)的基数去进行一次快速排序:
    ① 假设该基准元素位于最后一位,i j 同时从首个元素出发,j 从第一个元素开始向后寻找比基准小或基准元素:
    (1) 当 j 位置的元素小于基准元素,则 i j 的元素交换,i 往后移动一位,j 继续往后寻找;
    (2) 当 j 位置的元素等于基准元素,则 j 所在的与最后一位元素进行交换,j 从当前位置继续往后寻找;
    (3) 当 j 位置的元素大于基准元素,则 j 继续往后寻找;
    ② 直到 j == right 时,交换 i j 所在的元素,返回 i ,一次排序结束。

  2. 从螺钉(Screw)中选择进行一次排序返回的基准元素,作为螺母(Nut)的基准元素去对螺母进行一次快速排序:(同以上步骤)
    ① 假设该基准元素位于最后一位,i j 同时从首个元素出发,j 从第一个元素开始向后寻找比基准小或基准元素:
    (1) 当 j 位置的元素小于基准元素,则 i j 的元素交换,i 往后移动一位,j 继续往后寻找;
    (2) 当 j 位置的元素等于基准元素,则 j 所在的与最后一位元素进行交换,j 从当前位置继续往后寻找;
    (3) 当 j 位置的元素大于基准元素,则 j 继续往后寻找;
    ② 直到 j == right 时,交换 i j 所在的元素,返回 i ,一次排序结束。

根据以上步骤,将基准元素左、右的部分数组再次进行排序,直到数组有序

由于两个数组中的元素是1:1匹配的,所以当两个数组有序之后,螺母与螺钉的匹配问题也就解决了。

  • 代码以下:
import java.util.*;public class Main{static int k=1;public static void main(String[] args){int[] Nut = {6,8,1,2,9,3,7};int[] Screw = {9,3,7,1,6,2,8};System.out.println("螺母(Nut)  排序前:"+Arrays.toString(Nut));System.out.println("螺钉(Screw)排序前:"+Arrays.toString(Screw));Quicksort(Nut,Screw, 0, Screw.length-1);}public static void Quicksort(int[] Nut,int[] Screw,int left,int right){if(left>=right) return;System.out.println("第"+ (k++) +"次排序:");int std = partition(Screw, left, right, Nut[left]);partition(Nut, left, right, Screw[std]);System.out.println("此时的螺母(Nut)  的序列为:"+Arrays.toString(Nut));System.out.println("此时的螺钉(Screw)的序列为:"+Arrays.toString(Screw));Quicksort(Nut, Screw, left, std-1);Quicksort(Nut, Screw, std+1, right);}public static int partition(int[] nums,int left,int right,int std){if(left>=right) return left;int i=left,j=left;while(j < right){if(nums[j] < std){swap(nums, i, j);i++;}else if(nums[j] == std){swap(nums, j, right);continue;}j++;}swap(nums, i, j);return i;}public static void swap(int[] nums,int i,int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}

螺钉螺母匹配问题---快速排序相关推荐

  1. java小白探索,螺栓螺母匹配,冒泡实现和快速排序实现

    丁丁的算法作业,学大佬发博客,各位大佬教教我算法入门求求了.昨天大佬指出冒泡哪里有错误已经修改了,在源代码上加上了键入. package com.company;import java.util.Ar ...

  2. 趣味编程:函数式链表的快速排序

    前一段时间有朋友问我,以下这段Haskell快速排序的代码,是否可以转化成C#中等价的Lambda表达式实现: qsort [] = [] qsort (x:xs) = qsort (filter ( ...

  3. 【学习笔记】C#中HashTable和快速排序的用法,从单词频率统计小程序写起

    先瞎扯点别的.进入这个神圣的地方总需要些鞭策,阿西巴,我是被鞭策进来摆摊的程序猿.软件工程老师说,写程序,发博客,就来博客园.这是个号召力很强的口号.最近看网络营销 搜索引擎优化的书多一些,只能说王老 ...

  4. 【NLP】2020深度文本匹配最新进展:精度、速度我都要!

    文 | QvQ 编 | 兔子酱 在过去的几年里,信息检索(IR)领域见证了一系列神经排序模型的引入,这些模型多是基于表示或基于交互的,亦或二者的融合.然鹅,模型虽非常有效,尤其是基于 PLMs 的排序 ...

  5. 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方

    一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...

  6. 写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。(提示:不能使用系统已有函数,另外请仔细回忆以前学习过的 基础知识)...

    //冒泡排序(数组排序) function bubble_sort($array) {$count = count($array);if ($count <= 0) return false;f ...

  7. MTK优美代码赏析6:电话本里的快速排序和插入排序算法

    MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实 ...

  8. 2020深度文本匹配最新进展:精度、速度我都要!

    文 | QvQ 编 | 兔子酱 在过去的几年里,信息检索(IR)领域见证了一系列神经排序模型的引入,这些模型多是基于表示或基于交互的,亦或二者的融合.然鹅,模型虽非常有效,尤其是基于 PLMs 的排序 ...

  9. 设置线程堆栈大小_哇擦,传说中的堆栈溢出和快速排序

    stack overflow 堆栈溢出和快速排序这两个概念对开发人员来说并不陌生,但是通知都只是听说过,真正开发过程中却很少会遇到.我也是敲代码好些行后非常有幸撞上了,而且还是两个一起出现的,这其中过 ...

  10. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

最新文章

  1. Apache+php5
  2. LinksysWrt1900acs刷官方镜像并开启FTP
  3. Java-Integer源码分析
  4. 前端入门11-JavaScript语法之数组
  5. Qt Creator设置Meson
  6. Metric Learning度量学习:**矩阵学习和图学习
  7. 两个苹果手机如何同步数据_同步苹果手机和Windows的提醒事项
  8. edittext实现自动查询,刷新listview
  9. 今天的天气格外地好的dabeicun
  10. 变的不只有外观!iPhone 14 Pro更多细节曝光:相机、快充大升级
  11. Object-C 学习笔记(IOS程序设计课程)01
  12. 知识图谱中的结构信息建模
  13. 融媒体需要什么计算机软件,融媒体时代对编辑的能力要求
  14. band math函数_波段运算(bandmath)工具中常用的函数和实例.docx
  15. 电脑端思维导图软件推荐
  16. 命令行如何 copy 文件内容到剪切板(clipboard)?
  17. Saver类--变量的保存和恢复
  18. linux设置mysql防火墙端口映射_Linux防火墙默认是关闭3306端口,iptables实现端口转发、端口映射及双向通路...
  19. 一份机器学习的自白书
  20. 阿里云国际版两个ECS云服务器之间的迁移教程

热门文章

  1. 数据库----如何将oracle语句转换成mysql语句
  2. AlphaControls 控件 锐浪报表 Grid++Report 打印浏览显示问题解决
  3. ASCII码与16进制转换表
  4. 【NeurIPS 2019】Yoshua Bengio报告:深度学习系统从1代到2代中的基础知识
  5. A Frustratingly Easy Approach for Joint Entity and Relation Extraction(陈丹琦2020)
  6. 打卡项目php,Thinkphp框架早起打卡项目(深蓝引擎Z)趣步模式+完整数据+全开源源码...
  7. python自动登录教程_python+selenium实现京东自动登录及秒杀功能
  8. Proteus8仿真STM32F103R6的电压轨道问题
  9. Python 图像处理 OpenCV (12): Roberts 算子、 Prewitt 算子、 Sobel 算子和 Laplacian 算子边缘检测技术
  10. 数字图像处理——Sobel算子锐化、Prewitt算子锐化