进阶算法之“搜索排序”

  • 排序和搜索简介
    • 排序和搜索是什么?
    • JS中的排序和搜索
    • 排序算法
    • 搜索算法
  • Javascript实现:冒泡排序
  • Javascript实现:选择排序
  • Javascript实现:插入排序
  • Javascript实现:归并排序
  • Javascript实现:快速排序
  • Javascript实现:顺序搜索
  • Javascript实现:二分搜索
  • LeetCode:21.合并两个有序链表
  • LeetCode:374.猜数字大小
  • 思考题

排序和搜索简介

排序和搜索是什么?

排序:把某个乱序的数组变成升序或者降序的数组
搜索:找出数组中某个元素的下标

JS中的排序和搜索

JS中的排序:数组的sort方法
JS中的搜索:数组的indexOf方法

排序算法

冒泡排序,O(n^2)
选择排序,O(n^2)
插入排序,O(n^2)
归并排序,O(n * logN)
快速排序,O(n * logN)

搜索算法

顺序搜索,O(n)
二分搜索,O(logN)

Javascript实现:冒泡排序

冒泡排序的思路
比较所有相邻元素,如果第一个比第二个大,则交换它们
一轮下来,可以保证最后一个数是最大的
执行n-1轮,就可以完成排序

可以在https://visualgo.net/zh/sorting网站上查看算法动画效果

Array.prototype.bubbleSort = function () {for (let i = 0; i < this.length - 1; i += 1) {for (let j = 0; j < this.length - 1 - i; j += 1) {if (this[j] > this[j + 1]) {const temp = this[j];this[j] = this[j + 1];this[j + 1] = temp;}}}
};const arr = [5, 4, 3, 2, 1];
arr.bubbleSort();

时间复杂度O(n^2)

Javascript实现:选择排序

选择排序的思路
找到数组中的最小值,选中它并将其放置在第一位
接着找到第二小的值,选中它并将其放置在第二位
以此类推,执行n - 1轮

Array.prototype.selectionSort = function () {for (let i = 0; i < this.length - 1; i += 1) {let indexMin = i;for (let j = i; j < this.length; j += 1) {if (this[j] < this[indexMin]) {indexMin = j;}}if (indexMin !== i) {const temp = this[i];this[i] = this[indexMin];this[indexMin] = temp;}}
};const arr = [5, 4, 3, 2, 1];
arr.selectionSort();

时间复杂度O(n^2)

Javascript实现:插入排序

插入排序的思路
从第二个数开始往前比
比它大就往后排
以此类推进行到最后一个数

Array.prototype.insertionSort = function () {for (let i = 1; i < this.length; i += 1) {const temp = this[i];let j = i;while (j > 0) {if (this[j - 1] > temp) {this[j] = this[j - 1];} else {break;}j -= 1;}this[j] = temp;}
};const arr = [2, 4, 5, 3, 1];
arr.insertionSort();

时间复杂度O(n^2)

Javascript实现:归并排序

归并排序的思路
分:把数组劈成两半,再递归地对子数组进行“分操作”,直到分成一个个单独的数
合:把两个数合并为有序数组,再对有序数组进行合并,直到全部子数组合并成一个完整数组
合并两个有序数组
新建一个空数组res,用于存放最终排序后的数组
比较两个有序数组的头部,较小者出队并推入res中
如果两个数组还有值,就重复第二步

Array.prototype.mergeSort = function () {const rec = (arr) => {if (arr.length === 1) { return arr; }const mid = Math.floor(arr.length / 2);const left = arr.slice(0, mid);const right = arr.slice(mid, arr.length);const orderLeft = rec(left);const orderRight = rec(right);const res = [];while (orderLeft.length || orderRight.length) {if (orderLeft.length && orderRight.length) {res.push(orderLeft[0] < orderRight[0] ? orderLeft.shift() : orderRight.shift());} else if (orderLeft.length) {res.push(orderLeft.shift());} else if (orderRight.length) {res.push(orderRight.shift());}}return res;};const res = rec(this);res.forEach((n, i) => { this[i] = n; });
};const arr = [5, 4, 3, 2, 1];
arr.mergeSort();

分的时间复杂度是O(logN)
合的时间复杂度是O(n)
时间复杂度:O(n * logN)

Javascript实现:快速排序

快速排序的思路
分区:从数组中任意选择一个“基准”,所有比基准小的元素放在基准前面,比基准大的元素放在基准的后面
递归:递归地对基准前后的子数组进行分区

Array.prototype.quickSort = function () {const rec = (arr) => {if (arr.length === 1) { return arr; }const left = [];const right = [];const mid = arr[0];for (let i = 1; i < arr.length; i += 1) {if (arr[i] < mid) {left.push(arr[i]);} else {right.push(arr[i]);}}return [...rec(left), mid, ...rec(right)];};const res = rec(this);res.forEach((n, i) => { this[i] = n });
};const arr = [2, 4, 5, 3, 1];
arr.quickSort();

递归的时间复杂度是O(logN)
分区操作的时间复杂度是O(n)
时间复杂度:O(n * logN)

Javascript实现:顺序搜索

顺序搜索的思路
遍历数组
找到跟目标值相等的元素,就返回它的下标
遍历结束后,如果没有搜索到目标值,就返回-1

Array.prototype.sequentialSearch = function (item) {for (let i = 0; i < this.length; i += 1) {if (this[i] === item) {return i;}}return -1;
};const res = [1, 2, 3, 4, 5].sequentialSearch(0);

时间复杂度O(n)

Javascript实现:二分搜索

二分搜索前提是数组是有序的
二分搜索的思路
从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束
如果目标值大于或者小于中间元素,则在大于或小于中间元素的那一半数组中搜索

Array.prototype.binarySearch = function (item) {let low = 0;let high = this.length - 1;while (low <= high) {const mid = Math.floor((low + high) / 2);const element = this[mid];if (element < item) {low = mid + 1;} else if (element > item) {high = mid - 1;} else {return mid;}}return -1;
};const res = [1, 2, 3, 4, 5].binarySearch(0);

每一次比较都使搜索范围缩小一半,时间复杂度O(logN)

LeetCode:21.合并两个有序链表


解题思路
与归并排序中的合并两个有序数组很相似
将数组替换成链表就能解此题
解题步骤
新建一个新链表,作为返回结果
用指针遍历两个有序链表,并比较两个链表的当前节点,较小者先接入新链表,并将指针后移一步
链表遍历结束,返回新链表

时间复杂度O(n),n是两个链表长度之和,空间复杂度是O(1)

LeetCode:374.猜数字大小


解题思路
这不就是二分搜索嘛
调用guess函数,来判断中间元素是否是目标值
解题步骤
从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束
如果目标值大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找


时间复杂度O(logn),空间复杂度是O(1)

思考题

1、Chrome 最新的 Array.prototype.sort 用的是什么排序算法?
2、用二分搜索算法求 x 的平方根。题目链接:https://leetcode-cn.com/problems/sqrtx/

(十一)进阶算法之“搜索排序”相关推荐

  1. AcWing进阶算法课Level-4 第六章 搜索 (模拟退火,爬山)

    AcWing进阶算法课Level-4 第六章 搜索 模拟退火 AcWing 3167. 星星还是树110人打卡 AcWing 2424. 保龄球78人打卡 AcWing 2680. 均分数据72人打卡 ...

  2. python希尔排序的优缺点_Python排序搜索基本算法之希尔排序实例分析

    本文实例讲述了Python排序搜索基本算法之希尔排序.分享给大家供大家参考,具体如下: 希尔排序是插入排序的扩展,通过允许非相邻的元素进行交换来提高执行效率.希尔排序最关键的是选择步长,本程序选用Kn ...

  3. 编程方法学23:搜索排序与算法效率分析

    前言 本笔记是斯坦福公开课,编程方法学的学习笔记. 总体而言,这门课讲了很多很基础的东西,具有很强的通用性. 正文 本次的笔记对应的是第二十三节课,这堂课是助教来讲搜索排序与算法效率分析的知识. 1线 ...

  4. std中稳定排序算法_敏哥:深挖亚马逊A9算法中的广告搜索排序

    大家好,我是敏哥.最近国外疫情肆虐,牵动着所有跨境电商人的心.今天美国的确诊人数已经突破了33万人,每天以3万左右的确诊数量在增加,就连老虎也未能幸免. 国外疫情肆虐,对于跨境电商人而言并不是一个很好 ...

  5. 爱奇艺搜索排序算法实践(内附福利)

    7月3日下午,爱奇艺技术产品团队举办了"i技术会"线下技术沙龙,本次技术会的主题是"NLP与搜索".我们邀请到了来自字节跳动.去哪儿和腾讯的技术专家,与爱奇艺技 ...

  6. 排名算法(二)--淘宝搜索排序算法分析

    原文:https://blog.csdn.net/u011966339/article/details/78052569 淘宝搜索排序的目的是帮助用户快速的找到需要的商品.从技术上来说,就是在用户输入 ...

  7. 百度调整移动搜索排序算法 提升APP排名结果

    百度相关负责人表示,目前用手机访问PC网站难以获得最佳浏览体验,经过此次调整与页面优化,用户将看到更加适应手机屏幕.简洁的搜索页面. 目前,百度针对网站主提供"兼有手机站和PC站" ...

  8. 浅谈淘宝搜索排序算法【转自淘宝搜索博客】

    浅谈淘宝搜索排序算法 作者:鬼脚七     前言:        目前网上有很多介绍淘宝搜索排序的文章,大多是淘宝卖家们根据自己经验摸索整理出来的,里面提到的很多办法也很正确.只是搜索排序算法不是固定 ...

  9. 【淘宝SEO】官方淘宝搜索排序算法浅析(鬼脚七)

    浅谈淘宝搜索排序算法 作者:鬼脚七(淘宝搜索技术团队负责人) 前言: 目前网上有很多介绍淘宝搜索排序的文章,大多是淘宝卖家们根据自己经验摸索整理出来的,里面提到的很多办法也很正确.只是搜索排序算法不是 ...

最新文章

  1. Ansys节点数据批量一键导出脚本生成CSV (ansys数据导出利用matlab脚本)
  2. 【资源】100页机器学习入门完整版,初学者必备!
  3. 【华为云技术分享】mongos-sharding连接池配置
  4. Python将字符串转为字典最佳实践
  5. Oracle 10g升级之--PSU 升级(续)
  6. aref无效 lisp_Common Lisp专题4:数组
  7. 第二部分 Automake的标准工程组织
  8. 《Python算法教程简及PDF电子版下载
  9. 2021王道考研pdf
  10. 计算机视觉与图形学-神经渲染专题-神经体渲染:实时渲染KiloNeRF
  11. Linux系统u盘win7没驱动程序,u盘安装win7找不到设备驱动程序,教您解决u盘安装win7找不到设备驱动程序...
  12. linux英文论文范例,Argument essay官方主题范文三十六篇-经典英文议论文范例
  13. Win7下配置php运行环境
  14. Lambda表达式比较foreach使用
  15. 使用zlib对字符串进行压缩
  16. Microsoft Office Document Image Writer 和 Microsoft XPS Document Writer (Office组件轻松把PDF文件转成Word文档)...
  17. 【python】模拟淘宝的客服自动回复系统-socket,json,time模块的应用
  18. 【扩展欧几里得】Codeforces Round #406 (Div. 2) A. The Monster
  19. CodeForces 985 E Pencils and Boxes
  20. 0521-Hadoop命令无法访问HDFS路径诡异问题解决

热门文章

  1. 图像处理之添加文字水印
  2. 约瑟夫环 java实现
  3. spring boot项目打包成war并在tomcat上运行的步骤
  4. 一次CMS GC问题排查过程(理解原理+读懂GC日志)
  5. 接口测试基础之入门篇(待续)
  6. C#常用控件的属性以及方法(转载)
  7. 各岗位职责和基本能力要求
  8. 设计模式之(Factory method)工厂方法模式
  9. VS2005的depends工具 (分析EXE)
  10. 基础提供程序在 Open 上失败