摘要:看了一篇通俗易懂的快排文章快排,下面一步一步實(shí)現(xiàn)整個(gè)過程。快排的基本思想上面鏈接的文章對(duì)快排的思路提出了一個(gè)很形象的概念挖坑填數(shù)分治法,分三個(gè)步驟實(shí)現(xiàn)從數(shù)組中取出一個(gè)數(shù)作為基準(zhǔn)。
看了一篇通俗易懂的快排文章 快排,下面一步一步 實(shí)現(xiàn)整個(gè)過程。
快排的基本思想上面鏈接的文章對(duì)快排的思路提出了一個(gè)很形象的概念:挖坑填數(shù) + 分治法,分三個(gè)步驟實(shí)現(xiàn):
從數(shù)組中取出一個(gè)數(shù)作為基準(zhǔn)(pivot)。
在原數(shù)組中進(jìn)行移動(dòng),將大于基準(zhǔn)的數(shù)放到基準(zhǔn)右邊,小于基準(zhǔn)的數(shù)放到基準(zhǔn)左邊,在基準(zhǔn)左右形成兩個(gè)子數(shù)組。
在左右子數(shù)組中反復(fù)執(zhí)行步驟1、2,直到所有子數(shù)組只剩下一個(gè)數(shù)。
詳細(xì)步驟初始數(shù)組如下所示,取第一個(gè)數(shù)為基準(zhǔn),此時(shí):i = 0, j = 9, pivot = arr[0] = 36,此時(shí) i = 0 的位置就挖了一個(gè)坑,等待小于36的數(shù)來填這個(gè)坑。i 先不變,j-- 從后往前找小于基準(zhǔn)的數(shù):
i= 0, j = 8 時(shí),24 < 36,將 arr[8] 挖出,放入 arr[0] 的“坑中”(實(shí)際上在寫程序時(shí),是 arr[8] 與 arr[0] 交換)。接著arr[8] 的坑怎么填?調(diào)換順序從前往后找比基準(zhǔn)大的數(shù)(i++,j 不變):
i= 3, j = 8 時(shí),43 > 36,將 arr[3] 挖出,放入 arr[8] 的“坑中”。接著去找數(shù)填 arr[3] 的坑,調(diào)換順序從后往前找比基準(zhǔn)小的數(shù):
i= 3, j = 5 時(shí),20 > 36,反向查找:
i= j = 5 時(shí),退出,第一趟排序完成,以 arr[5] = 36 為界分為左右兩個(gè)子數(shù)組:
接著在左右兩個(gè)子數(shù)組中重復(fù)上面的排序過程,直到每個(gè)子數(shù)組的長度為1,排序結(jié)束!下面只給出每一步的執(zhí)行結(jié)果:
JS代碼// 快排 function quickSort(arr, i, j) { if(i < j) { let left = i; let right = j; let pivot = arr[left]; while(i < j) { while(arr[j] >= pivot && i < j) { // 從后往前找比基準(zhǔn)小的數(shù) j--; } if(i < j) { arr[i++] = arr[j]; } while(arr[i] <= pivot && i < j) { // 從前往后找比基準(zhǔn)大的數(shù) i++; } if(i < j) { arr[j--] = arr[i]; } } arr[i] = pivot; quickSort(arr, left, i-1); quickSort(arr, i+1, right); return arr; } } // example let arr = [2, 10, 4, 1, 0, 9, 5 ,2]; console.log(quickSort(arr, 0 , arr.length-1));
有的書上是以中間的數(shù)作為基準(zhǔn)數(shù)的,要實(shí)現(xiàn)這個(gè)方便非常方便,直接將中間的數(shù)和第一個(gè)數(shù)進(jìn)行交換就可以了。
function quickSort(arr, i, j) { if(i < j) { let left = i; let right = j; let mid = Math.floor((left+right)/2); let temp = arr[left]; arr[left] = arr[mid]; arr[mid] = temp; let pivot = arr[left]; while(i < j) { while(arr[j] >= pivot && i < j) { // 從后往前找比基準(zhǔn)小的數(shù) j--; } if(i < j) { arr[i++] = arr[j]; } while(arr[i] <= pivot && i < j) { // 從前往后找比基準(zhǔn)大的數(shù) i++; } if(i < j) { arr[j--] = arr[i]; } } arr[i] = pivot; quickSort(arr, left, i-1); quickSort(arr, i+1, right); return arr; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95950.html
摘要:用冒泡排序快速排序選擇排序冒泡排序冒泡排序是比較經(jīng)典的排序方法,是一種用時(shí)間換空間的排序方法。找到并交換的時(shí)候,指針位置不變。選擇排序沒趟都會(huì)產(chǎn)生最小值,它不是相鄰元素的比較而是在該元素設(shè)置一個(gè)索引。選擇排序循環(huán)找到從開始到最后的最小的數(shù) 用js冒泡排序,快速排序,選擇排序 1.冒泡排序 冒泡排序是比較經(jīng)典的排序方法,是一種用時(shí)間換空間的排序方法。我總結(jié)了一下它的特點(diǎn):(1)它的時(shí)間復(fù)...
摘要:所有關(guān)鍵字比該記錄關(guān)鍵字小的記錄放置在前一部分,所有比它大的記錄放置在后一部分,并把改記錄排在這兩部分的中間稱為該記錄歸位,這個(gè)過程稱作一次快速排序。代碼如下大佬的代碼還是比較厲害的,簡單易懂,佩服以上就是相關(guān)的快速排序的實(shí)現(xiàn)方法 由于自己不是計(jì)算機(jī)專業(yè),數(shù)據(jù)結(jié)構(gòu)沒有太多研究,曾經(jīng)面試時(shí)有被問過關(guān)于快速排序以及冒泡排序的寫法,冒泡排序比較簡單,當(dāng)時(shí)能回答出來,但是快速排序當(dāng)時(shí)就比較懵逼...
摘要:快速排序英語,又稱劃分交換排序,簡稱快排,一種排序算法,最早由東尼霍爾提出。 快速排序(英語:Quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序算法,最早由東尼·霍爾提出。在平均狀況下,排序n個(gè)項(xiàng)目要O(nLogn)次比較。在最壞狀況下則需要O(n^2)次比較,但這種狀況并不常見。事實(shí)上,快速排序O(nLogn)通常明顯比其他算...
摘要:公共函數(shù)庫用于取出隨機(jī)排列的數(shù)字原數(shù)組給原數(shù)組賦值排序算法插入排序時(shí)間復(fù)雜度二分法插入排序選擇排序快速排序一堆排序測試用例插入排序時(shí)間測試二分法插入排序時(shí)間測試選擇排序時(shí)間測試快速排序時(shí)間測試一堆 公共函數(shù)庫(用于取出隨機(jī)排列的數(shù)字) module.exports={ randomIntegerArray:function(count){ var origina...
摘要:然后再分別對(duì)基數(shù)左邊和右邊的數(shù)組進(jìn)行相同的操作,直到數(shù)組中只有一個(gè)元素時(shí),返回該數(shù)組。 快速排序算法 今天大概講下使用js實(shí)現(xiàn)快速排序算法: 快速排序算法的思想類似于二分法,每次都是在數(shù)組中選擇一個(gè)基數(shù)(可以是任意一個(gè)位置的數(shù),不過一般選擇中間的數(shù)字或者最左邊的數(shù)字),每一輪結(jié)束后,比該基數(shù)小的數(shù)都位于該基數(shù)的左邊,比該基數(shù)大的數(shù)都位于該基數(shù)的右邊。然后再分別對(duì)基數(shù)左邊和右邊的數(shù)組進(jìn)行...
摘要:快速排序是一種劃分交換排序。快速排序基于冒泡遞歸分治。他在大數(shù)據(jù)情況下是最快的排序算法之一,平均事件復(fù)雜度很低而且前面的系數(shù)很小,在大量隨機(jī)輸入的情況下最壞情況出現(xiàn)的概率是極小的。 快速排序是一種劃分交換排序。它采用了一種分治的策略,通常稱其為分治法。 分治法的基本思想是:將原問題分解為若干個(gè)規(guī)模更小但結(jié)構(gòu)與原問題相似的子問題。遞歸地解這些子問題,然后將這些子問題的解組合為原問題的解。...
閱讀 1194·2021-11-24 09:38
閱讀 3623·2021-11-22 15:32
閱讀 3491·2019-08-30 15:54
閱讀 2595·2019-08-30 15:53
閱讀 1522·2019-08-30 15:52
閱讀 2636·2019-08-30 13:15
閱讀 1866·2019-08-29 12:21
閱讀 1432·2019-08-26 18:36