(十一)进阶算法之“搜索排序”
進階算法之“搜索排序”
- 排序和搜索簡介
- 排序和搜索是什么?
- JS中的排序和搜索
- 排序算法
- 搜索算法
- Javascript實現(xiàn):冒泡排序
- Javascript實現(xiàn):選擇排序
- Javascript實現(xiàn):插入排序
- Javascript實現(xiàn):歸并排序
- Javascript實現(xiàn):快速排序
- Javascript實現(xiàn):順序搜索
- Javascript實現(xiàn):二分搜索
- LeetCode:21.合并兩個有序鏈表
- LeetCode:374.猜數(shù)字大小
- 思考題
排序和搜索簡介
排序和搜索是什么?
排序:把某個亂序的數(shù)組變成升序或者降序的數(shù)組
搜索:找出數(shù)組中某個元素的下標
JS中的排序和搜索
JS中的排序:數(shù)組的sort方法
JS中的搜索:數(shù)組的indexOf方法
排序算法
冒泡排序,O(n^2)
選擇排序,O(n^2)
插入排序,O(n^2)
歸并排序,O(n * logN)
快速排序,O(n * logN)
…
搜索算法
順序搜索,O(n)
二分搜索,O(logN)
…
Javascript實現(xiàn):冒泡排序
冒泡排序的思路
比較所有相鄰元素,如果第一個比第二個大,則交換它們
一輪下來,可以保證最后一個數(shù)是最大的
執(zhí)行n-1輪,就可以完成排序
可以在https://visualgo.net/zh/sorting網(wǎng)站上查看算法動畫效果
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();時間復(fù)雜度O(n^2)
Javascript實現(xiàn):選擇排序
選擇排序的思路
找到數(shù)組中的最小值,選中它并將其放置在第一位
接著找到第二小的值,選中它并將其放置在第二位
以此類推,執(zhí)行n - 1輪
時間復(fù)雜度O(n^2)
Javascript實現(xiàn):插入排序
插入排序的思路
從第二個數(shù)開始往前比
比它大就往后排
以此類推進行到最后一個數(shù)
時間復(fù)雜度O(n^2)
Javascript實現(xiàn):歸并排序
歸并排序的思路
分:把數(shù)組劈成兩半,再遞歸地對子數(shù)組進行“分操作”,直到分成一個個單獨的數(shù)
合:把兩個數(shù)合并為有序數(shù)組,再對有序數(shù)組進行合并,直到全部子數(shù)組合并成一個完整數(shù)組
合并兩個有序數(shù)組
新建一個空數(shù)組res,用于存放最終排序后的數(shù)組
比較兩個有序數(shù)組的頭部,較小者出隊并推入res中
如果兩個數(shù)組還有值,就重復(fù)第二步
分的時間復(fù)雜度是O(logN)
合的時間復(fù)雜度是O(n)
時間復(fù)雜度:O(n * logN)
Javascript實現(xiàn):快速排序
快速排序的思路
分區(qū):從數(shù)組中任意選擇一個“基準”,所有比基準小的元素放在基準前面,比基準大的元素放在基準的后面
遞歸:遞歸地對基準前后的子數(shù)組進行分區(qū)
遞歸的時間復(fù)雜度是O(logN)
分區(qū)操作的時間復(fù)雜度是O(n)
時間復(fù)雜度:O(n * logN)
Javascript實現(xiàn):順序搜索
順序搜索的思路
遍歷數(shù)組
找到跟目標值相等的元素,就返回它的下標
遍歷結(jié)束后,如果沒有搜索到目標值,就返回-1
時間復(fù)雜度O(n)
Javascript實現(xiàn):二分搜索
二分搜索前提是數(shù)組是有序的
二分搜索的思路
從數(shù)組的中間元素開始,如果中間元素正好是目標值,則搜索結(jié)束
如果目標值大于或者小于中間元素,則在大于或小于中間元素的那一半數(shù)組中搜索
每一次比較都使搜索范圍縮小一半,時間復(fù)雜度O(logN)
LeetCode:21.合并兩個有序鏈表
解題思路
與歸并排序中的合并兩個有序數(shù)組很相似
將數(shù)組替換成鏈表就能解此題
解題步驟
新建一個新鏈表,作為返回結(jié)果
用指針遍歷兩個有序鏈表,并比較兩個鏈表的當前節(jié)點,較小者先接入新鏈表,并將指針后移一步
鏈表遍歷結(jié)束,返回新鏈表
時間復(fù)雜度O(n),n是兩個鏈表長度之和,空間復(fù)雜度是O(1)
LeetCode:374.猜數(shù)字大小
解題思路
這不就是二分搜索嘛
調(diào)用guess函數(shù),來判斷中間元素是否是目標值
解題步驟
從數(shù)組的中間元素開始,如果中間元素正好是目標值,則搜索過程結(jié)束
如果目標值大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半中查找
時間復(fù)雜度O(logn),空間復(fù)雜度是O(1)
思考題
1、Chrome 最新的 Array.prototype.sort 用的是什么排序算法?
2、用二分搜索算法求 x 的平方根。題目鏈接:https://leetcode-cn.com/problems/sqrtx/
總結(jié)
以上是生活随笔為你收集整理的(十一)进阶算法之“搜索排序”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪吒 S 首任车主补偿方案出炉:免费加电
- 下一篇: (十二)算法设计思想之“分而治之”