亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

算法系列——JavaScript快速排序思想實(shí)現(xiàn)

lentrue / 2509人閱讀

摘要:源碼實(shí)現(xiàn)快速排序理論理解起來很容易,但經(jīng)常是實(shí)際寫代碼,無從下手,下面是我根據(jù)快排的步驟實(shí)現(xiàn)的遞歸快速排序。合并第一次快速排序的,,數(shù)組。

原理

快速排序離不開遞歸的思想,你如果不了解遞歸,可以結(jié)合我另外一篇文章來學(xué)習(xí) 算法入門之遞歸分而治之思想的實(shí)現(xiàn)

網(wǎng)上有有趣的動(dòng)態(tài)圖來表示快速排序,但其實(shí)我們大部分程序員都是腦子不太好使那種,即使看了形象生動(dòng)的動(dòng)態(tài)圖,還是想不到具體實(shí)現(xiàn)思路。

排序都有基本的步驟,快排也不例外,通常分為這么幾步:

1、選擇基準(zhǔn)值;

2、需要2個(gè)空數(shù)組,分別位于基準(zhǔn)值的左邊和右邊,小于基準(zhǔn)值的push到左邊的數(shù)組,大于基準(zhǔn)值的push到右邊的數(shù)組;

3、遞歸重復(fù)上面的步驟。

具體思路分析
原始數(shù)組 [2, 4, 1, 5, 3, 1]
找基準(zhǔn)值 base 末尾元素1
拆分 left [1] <- [base] -> [2, 4, 5, 3] right
遞歸 對left和right的數(shù)組重復(fù)第一步找新的基準(zhǔn)值
模擬遞歸1 [1], [1], [2] <- [3] -> [4, 5]
模擬遞歸2 [1], [1], [2], [3], [4] <- [5] -> []
遞歸結(jié)束,合并數(shù)組 [...[1], ...[1], ...[2], ...[3], ...[4], ...[5]]

這個(gè)表格模擬快速排序的具體步驟,遞歸是將一種規(guī)律重復(fù)執(zhí)行N次的操作,我們找到快速排序的規(guī)律,然后return 遞歸,當(dāng)遞歸到數(shù)組為1個(gè)元素時(shí),不再遞歸,因?yàn)橹皇R粋€(gè)元素的數(shù)組不需要再比較了。

JavaScript源碼實(shí)現(xiàn)快速排序

理論理解起來很容易,但經(jīng)常是實(shí)際寫代碼,無從下手,下面是我根據(jù)快排的步驟實(shí)現(xiàn)的遞歸快速排序。qSort函數(shù)不復(fù)雜,他表示執(zhí)行一次找基準(zhǔn)值并且遍歷比較的過程,而你可能不太理解的是函數(shù)最后面的return。

return [...qSort(left), ...[base], ...qSort(right)]

將這個(gè)return拆分開來看。

1、返回值應(yīng)該是個(gè)數(shù)組 。

return []

2、合并第一次快速排序的left,base,right數(shù)組。接著就交給遞歸去執(zhí)行左邊和右邊數(shù)組的排序。

return [qSort(left), [base], qSort(right)]

3、因?yàn)閝Sort返回的是數(shù)組,不是數(shù)組元素,所以需要用ES6語法...來散列開。

完整代碼:

function qSort(arr) {
  //聲明并初始化左邊的數(shù)組和右邊的數(shù)組
  var left = [], right = []
  //使用數(shù)組最后一個(gè)元素作為基準(zhǔn)值
  var base = arr[arr.length - 1]
  //當(dāng)數(shù)組長度只有1或者為空時(shí),直接返回?cái)?shù)組,不需要排序
  if(arr.length <= 1) return arr
  
  //進(jìn)行遍歷
  for(var i = 0, len = arr.length; i < len - 1; i++) {
    if(arr[i] <= base) {
    //如果小于基準(zhǔn)值,push到左邊的數(shù)組
      left.push(arr[i])
    } else {
    //如果大于基準(zhǔn)值,push到右邊的數(shù)組
      right.push(arr[i])
    }
  }
  //遞歸并且合并數(shù)組元素
  return [...qSort(left), ...[base], ...qSort(right)]
}
const arr = [2, 4, 1, 5, 3, 1]
const s = qSort(arr)

console.log(s) // [1, 1, 2, 3, 4, 5]
時(shí)間復(fù)雜度

快速排序的平均時(shí)間復(fù)雜度是O(nlogn),最差情況是O(n2)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/89668.html

相關(guān)文章

  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 歸并排序快速排序、希爾排序、堆排序

    摘要:之所以把歸并排序快速排序希爾排序堆排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r(shí)間復(fù)雜度都為。歸并排序是一種穩(wěn)定的排序方法。因此,快速排序并不穩(wěn)定。希爾排序思想先將整個(gè)待排序的記錄序列分割成為若干子序列。 showImg(https://segmentfault.com/img/bVbvpYZ?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,只有內(nèi)功深厚者,前端之路才...

    haitiancoder 評論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 桶排序、計(jì)數(shù)排序、基數(shù)排序

    摘要:之所以把計(jì)數(shù)排序桶排序基數(shù)排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r(shí)間復(fù)雜度都為。動(dòng)畫計(jì)數(shù)排序思想找出待排序的數(shù)組中最大和最小的元素。桶排序計(jì)數(shù)排序能派上用場嗎手機(jī)號(hào)碼有位,范圍太大,顯然不適合用這兩種排序算法。 showImg(https://segmentfault.com/img/bVbuF9e?w=900&h=500); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,只有內(nèi)功深厚者...

    Awbeci 評論0 收藏0
  • 算法系列——JavaScript中廣度優(yōu)先搜索思想實(shí)現(xiàn)

    摘要:散列表上面的地圖向我們展示了如何用廣度優(yōu)先搜索的思想找到北京到廣州的最短路線。在廣度優(yōu)先搜索中,我們需要用到隊(duì)列的這種思想來實(shí)現(xiàn)查找。建立了下面這個(gè)模型武漢廣州西藏上海上海武漢廣州代碼完整實(shí)現(xiàn),利用遞歸和廣度優(yōu)先搜索的思想實(shí)現(xiàn)。 什么是廣度優(yōu)先搜索? 如果只是是背概念,幼兒園的小朋友都能背下來念給你聽。 假設(shè)看這篇文章的都和我一樣是個(gè)前端工程師,我們要從廣度優(yōu)先搜索(BFS)中學(xué)到什么...

    everfly 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<