摘要:所有關(guān)鍵字比該記錄關(guān)鍵字小的記錄放置在前一部分,所有比它大的記錄放置在后一部分,并把改記錄排在這兩部分的中間稱為該記錄歸位,這個過程稱作一次快速排序。代碼如下大佬的代碼還是比較厲害的,簡單易懂,佩服以上就是相關(guān)的快速排序的實現(xiàn)方法
由于自己不是計算機專業(yè),數(shù)據(jù)結(jié)構(gòu)沒有太多研究,曾經(jīng)面試時有被問過關(guān)于快速排序以及冒泡排序的寫法,冒泡排序比較簡單,當時能回答出來,但是快速排序當時就比較懵逼,不知道是個什么方式實現(xiàn)的,面試回來后也沒太在意,最近在看C語言的數(shù)據(jù)結(jié)構(gòu),拓展下這方面的知識,其中就看到了關(guān)于快排算法的描述
描述如下:在待排序的n個記錄中任取一個記錄(通常取第一個記錄),數(shù)據(jù)序列被此記錄劃分成兩部分。所有關(guān)鍵字比該記錄關(guān)鍵字小的記錄放置在前一部分,所有比它大的記錄放置在后一部分,并把改記錄排在這兩部分的中間(稱為該記錄歸位),這個過程稱作一次快速排序。之后對所有的兩部分分別重復上述過程,直至每部分內(nèi)只有一個記錄或空為止。
光看概念有點暈,書上用的是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ù)組:[6,8,7,9,0,1,3,2,4,5]
取第一個元素為參考元素,先從尾端開始即end向左遍歷,元素下標為j, 發(fā)現(xiàn)比參考元素小的值,則與從左向右遍歷的元素arr[i]進行交換,然后就從i開始向右遍歷,找到一個比參考元素大的值,而后與arr[j]進行交換,最終i = j 時完成一次快速排序,然后對左邊部分進行快排,對右邊進行快排。
根據(jù)書上就是這樣的了,自己也嘗試了下,答案是沒有問題的
然后看網(wǎng)上某位大佬的做法,更加簡單易懂,將快排簡單化,就是比參考元素小的放置左邊部分,比參考元素大的放置右邊部分,而后分別對兩部分進行快排。
代碼如下:
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)) }
大佬的代碼還是比較厲害的,簡單易懂,佩服
以上就是相關(guān)的快速排序的實現(xiàn)方法
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89852.html
摘要:今天跟大家分享多種排序算法里使用較廣泛,速度快的排序算法快速排序法平均時間復雜度為。快速排序法的原理快速排序是一種劃分交換排序,它采用分治的策略,通常稱其為分治法。 HTML5學堂-碼匠:前幾期算法之旅跟大家分享了冒泡排序法和選擇排序法,它們都屬于時間復雜度為O(n^2)的慢排序。今天跟大家分享多種排序算法里使用較廣泛,速度快的排序算法—— 快速排序法 [ 平均時間復雜度為O (n l...
摘要:雖然有著各種各樣的不同,但是相同的是,他們前端優(yōu)化不完全指南前端掘金篇幅可能有點長,我想先聊一聊閱讀的方式,我希望你閱讀的時候,能夠把我當作你的競爭對手,你的夢想是超越我。 如何提升頁面渲染效率 - 前端 - 掘金Web頁面的性能 我們每天都會瀏覽很多的Web頁面,使用很多基于Web的應用。這些站點看起來既不一樣,用途也都各有不同,有在線視頻,Social Media,新聞,郵件客戶端...
摘要:忍者級別的函數(shù)操作對于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數(shù)是一個很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎, 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機制,如果...
摘要:插入排序是穩(wěn)定的算法。所以準確的說,當數(shù)組長度大于的時候,采用了快速排序和插入排序的混合排序方法。在對數(shù)組進行了一次快速排序后,然后對兩個子集分別進行了插入排序,最終修改數(shù)組為正確排序后的數(shù)組。 JavaScript 專題系列第二十篇,也是最后一篇,解讀 v8 排序源碼 前言 v8 是 Chrome 的 JavaScript 引擎,其中關(guān)于數(shù)組的排序完全采用了 JavaScript 實...
閱讀 3245·2023-04-26 01:31
閱讀 1892·2023-04-25 22:08
閱讀 3430·2021-09-01 11:42
閱讀 2823·2019-08-30 12:58
閱讀 2165·2019-08-29 18:31
閱讀 2429·2019-08-29 17:18
閱讀 3064·2019-08-29 13:01
閱讀 2552·2019-08-28 18:22