成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

關(guān)于JS的快速排序?qū)崿F(xiàn)方法

LeexMuller / 1376人閱讀

摘要:所有關(guān)鍵字比該記錄關(guān)鍵字小的記錄放置在前一部分,所有比它大的記錄放置在后一部分,并把改記錄排在這兩部分的中間稱為該記錄歸位,這個(gè)過(guò)程稱作一次快速排序。代碼如下大佬的代碼還是比較厲害的,簡(jiǎn)單易懂,佩服以上就是相關(guān)的快速排序的實(shí)現(xiàn)方法

由于自己不是計(jì)算機(jī)專業(yè),數(shù)據(jù)結(jié)構(gòu)沒(méi)有太多研究,曾經(jīng)面試時(shí)有被問(wèn)過(guò)關(guān)于快速排序以及冒泡排序的寫法,冒泡排序比較簡(jiǎn)單,當(dāng)時(shí)能回答出來(lái),但是快速排序當(dāng)時(shí)就比較懵逼,不知道是個(gè)什么方式實(shí)現(xiàn)的,面試回來(lái)后也沒(méi)太在意,最近在看C語(yǔ)言的數(shù)據(jù)結(jié)構(gòu),拓展下這方面的知識(shí),其中就看到了關(guān)于快排算法的描述

描述如下:在待排序的n個(gè)記錄中任取一個(gè)記錄(通常取第一個(gè)記錄),數(shù)據(jù)序列被此記錄劃分成兩部分。所有關(guān)鍵字比該記錄關(guān)鍵字小的記錄放置在前一部分,所有比它大的記錄放置在后一部分,并把改記錄排在這兩部分的中間(稱為該記錄歸位),這個(gè)過(guò)程稱作一次快速排序。之后對(duì)所有的兩部分分別重復(fù)上述過(guò)程,直至每部分內(nèi)只有一個(gè)記錄或空為止。

光看概念有點(diǎn)暈,書上用的是C的源代碼,改寫下,變成JS代碼:

function quickSort(arr, start, end){
        var i = start
        var j = end
        if (start < end ) {
            
            var temp = arr[start]
            while (i != j ) {
                while(arr[j] > temp && j > i){
                    j--
                }
                var com = arr[j]
                arr[j] = arr[i]
                arr[i] = com
                while(arr[i] < temp && i < j){
                    i++
                }
                var com1 = arr[j]
                arr[j] = arr[i]
                arr[i] = com1
            }
            arr[i] = temp
            quickSort(arr, start, i - 1)
            quickSort(arr, i + 1, end)
        }
    }

解釋下:
假設(shè)一個(gè)無(wú)序數(shù)組:[6,8,7,9,0,1,3,2,4,5]
取第一個(gè)元素為參考元素,先從尾端開始即end向左遍歷,元素下標(biāo)為j, 發(fā)現(xiàn)比參考元素小的值,則與從左向右遍歷的元素arr[i]進(jìn)行交換,然后就從i開始向右遍歷,找到一個(gè)比參考元素大的值,而后與arr[j]進(jìn)行交換,最終i = j 時(shí)完成一次快速排序,然后對(duì)左邊部分進(jìn)行快排,對(duì)右邊進(jìn)行快排。

根據(jù)書上就是這樣的了,自己也嘗試了下,答案是沒(méi)有問(wèn)題的

然后看網(wǎng)上某位大佬的做法,更加簡(jiǎn)單易懂,將快排簡(jiǎn)單化,就是比參考元素小的放置左邊部分,比參考元素大的放置右邊部分,而后分別對(duì)兩部分進(jìn)行快排。

代碼如下:

function quickSort(arr){
    if (arr.length <= 1) {
        return arr
    }

    var left = [], right=[]
    var pivotIndex = Math.floor(arr.length / 2)
    var pivot = arr.splice(pivotIndex, 1)[0]
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i])
        }else {
            right.push(arr[i])
        }
    }

    return quickSort(left).concat([pivot], quickSort(right))
}

大佬的代碼還是比較厲害的,簡(jiǎn)單易懂,佩服

以上就是相關(guān)的快速排序的實(shí)現(xiàn)方法

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89852.html

相關(guān)文章

  • 算法之旅 | 快速排序

    摘要:今天跟大家分享多種排序算法里使用較廣泛,速度快的排序算法快速排序法平均時(shí)間復(fù)雜度為??焖倥判蚍ǖ脑砜焖倥判蚴且环N劃分交換排序,它采用分治的策略,通常稱其為分治法。 HTML5學(xué)堂-碼匠:前幾期算法之旅跟大家分享了冒泡排序法和選擇排序法,它們都屬于時(shí)間復(fù)雜度為O(n^2)的慢排序。今天跟大家分享多種排序算法里使用較廣泛,速度快的排序算法—— 快速排序法 [ 平均時(shí)間復(fù)雜度為O (n l...

    AlanKeene 評(píng)論0 收藏0
  • 前端優(yōu)化 - 收藏集 - 掘金

    摘要:雖然有著各種各樣的不同,但是相同的是,他們前端優(yōu)化不完全指南前端掘金篇幅可能有點(diǎn)長(zhǎng),我想先聊一聊閱讀的方式,我希望你閱讀的時(shí)候,能夠把我當(dāng)作你的競(jìng)爭(zhēng)對(duì)手,你的夢(mèng)想是超越我。 如何提升頁(yè)面渲染效率 - 前端 - 掘金Web頁(yè)面的性能 我們每天都會(huì)瀏覽很多的Web頁(yè)面,使用很多基于Web的應(yīng)用。這些站點(diǎn)看起來(lái)既不一樣,用途也都各有不同,有在線視頻,Social Media,新聞,郵件客戶端...

    VincentFF 評(píng)論0 收藏0
  • JavasScript重難點(diǎn)知識(shí)

    摘要:忍者級(jí)別的函數(shù)操作對(duì)于什么是匿名函數(shù),這里就不做過(guò)多介紹了。我們需要知道的是,對(duì)于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...

    forsigner 評(píng)論0 收藏0
  • JavaScript專題之解讀 v8 排序源碼

    摘要:插入排序是穩(wěn)定的算法。所以準(zhǔn)確的說(shuō),當(dāng)數(shù)組長(zhǎng)度大于的時(shí)候,采用了快速排序和插入排序的混合排序方法。在對(duì)數(shù)組進(jìn)行了一次快速排序后,然后對(duì)兩個(gè)子集分別進(jìn)行了插入排序,最終修改數(shù)組為正確排序后的數(shù)組。 JavaScript 專題系列第二十篇,也是最后一篇,解讀 v8 排序源碼 前言 v8 是 Chrome 的 JavaScript 引擎,其中關(guān)于數(shù)組的排序完全采用了 JavaScript 實(shí)...

    princekin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

LeexMuller

|高級(jí)講師

TA的文章

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