快速排序

1.每一輪排序選擇一個基準點進行分區(qū)
1.1 讓小于基準點的元素進入一個分區(qū)饱亿,大于基準點的元素進入另一個分區(qū)
1.2 當分區(qū)完成時闰靴,基準點元素的位置就是最終位置
2.在子分區(qū)內重置以上過程,直至子分區(qū)元素個數(shù)小于等于1配猫。該算法提現(xiàn)的是分而治之的思想

一膘掰、單邊循環(huán)快排(lomuto洛穆托分區(qū)方案)
1.選擇最右邊元素作為基準點元素
2.j指針負責找到比基準點小的元素,一旦找到則與i進行交換
3.i指針維護小于基準點元素的邊界识埋,也是每次交換的目標索引
4.最后基準點與i交換,i即為分區(qū)位置

         window.onload = function() {
              var arr = [2,4,9,1,7,3,6,8,5]
              // 快速排序
              quickSort(arr)
         }

        // 單邊快排
        function partition1(arr, left, right) {
            var tmp = arr[right] // 取最右側的為基準值
            var i = left

            for (let j = i; j < right; j++) {
                
                if (arr[j] < tmp) {
                    if (i != j) {
                        swap(arr, i, j)
                    }
                    i++
                }
                
            }

            if (i != right) {
                swap(arr, right, i)
            }

            return i
        }
      // 遞歸循環(huán)
        function quickSort1(arr, left, right){
            var start = left || 0
            var end = right != undefined ? right : arr.length - 1
            if (start < end) {
                // 進行一輪后基準值所在位置的索引
                var index = partition1(arr, start, end)
                // 進行左側分區(qū)范圍確定
                quickSort1(arr, start, index - 1)
                // 進行右側分區(qū)范圍確定
                quickSort1(arr, index + 1, end)
            }
        }
      // 交換兩個值
        function swap(arr, i, j) {
            var tmp = arr[i]
            arr[i] = arr[j]
            arr[j] = tmp
        }

二、雙邊循環(huán)快排
1.選擇最左邊作為基準點元素
2.j指針負責從右向左找到比基準點小的元素惠豺,i指針負責從左向右找到比基準點大的元素,一旦找到二者交換蛹疯,直到i热监、j相交
3.最后基準點與i(此時i與j相等)交換,i即為分區(qū)位置

         window.onload = function() {
              var arr = [2,4,9,1,7,3,6,8,5]
              // 快速排序
              quickSort(arr)
         }
        // 雙邊快速排序
        function partition(arr, left, right) {
            var tmp = arr[left] // 取左側為基準值
            var i = left
            var j = right

            while (i < j) {
                // 先從右向左找小的
                while (i < j && arr[j] > tmp) {
                    j--
                }
                // 從右向左找大的
                while (i < j && arr[i] <= tmp) {
                    i++
                }
                // 交換大小值的位置,將小的放在左邊,大的放在右邊
                swap(arr, i, j)
            }
            // 將基準值填入坑里
            swap(arr, left, i)
            return i
        }

        function quickSort(arr, left, right) {
            var start = left || 0
            var end = right !== undefined ? right : arr.length - 1
            if (start < end) {
                // 進行一輪后基準值所在位置的索引
                var index = partition(arr, start, end)
                // 進行左側分區(qū)范圍確定
                quickSort(arr, start, index - 1)
                // 進行右側分區(qū)范圍確定
                quickSort(arr, index + 1, end)
            }
            console.log(arr)
            return arr
        }
        // 交換兩個值
        function swap(arr, i, j) {
            var tmp = arr[i]
            arr[i] = arr[j]
            arr[j] = tmp
        }

雙邊循環(huán)的要點:
1.基準點取左邊的值列吼,并且要先右后左
2.while (i < j && arr[j] > tmp) j--
3.while (i < j && arr[i] <= tmp) i++

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末寞钥,一起剝皮案震驚了整個濱河市陌选,隨后出現(xiàn)的幾起案子蹄溉,更是在濱河造成了極大的恐慌香浩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻吭,死亡現(xiàn)場離奇詭異,居然都是意外死亡膏蚓,警方通過查閱死者的電腦和手機畸写,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枯芬,“玉大人,你說我怎么就攤上這事狂魔∫担” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵籽孙,是天一觀的道長火俄。 經常有香客問我,道長瓜客,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮德迹,結果婚禮上,老公的妹妹穿的比我還像新娘卸例。我一直安慰自己称杨,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布筷转。 她就那樣靜靜地躺著姑原,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呜舒。 梳的紋絲不亂的頭發(fā)上锭汛,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音袭蝗,去河邊找鬼唤殴。 笑死,一個胖子當著我的面吹牛到腥,可吹牛的內容都是我干的朵逝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼配名,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晋辆?” 一聲冷哼從身側響起渠脉,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栈拖,沒想到半個月后连舍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡涩哟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年索赏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贴彼。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡潜腻,死狀恐怖,靈堂內的尸體忽然破棺而出器仗,到底是詐尸還是另有隱情融涣,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布精钮,位于F島的核電站威鹿,受9級特大地震影響,放射性物質發(fā)生泄漏轨香。R本人自食惡果不足惜忽你,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臂容。 院中可真熱鬧科雳,春花似錦根蟹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尿赚,卻和暖如春散庶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吼畏。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工督赤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泻蚊。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓躲舌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親性雄。 傳聞我的和親對象是個殘疾皇子没卸,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • 一、算法概述 1.1 算法分類 十種常見排序算法可以分為兩大類: 比較類排序:通過比較來決定元素間的相對次序秒旋,由于...
    小波同學閱讀 2,558評論 0 5
  • 思想 快速排序采用的思想是分治思想约计。快速排序是找出一個元素(理論上可以隨便找一個)作為基準(pivot)迁筛,然后對數(shù)...
    水欣閱讀 342評論 0 0
  • 序言 由于快速排序有多個優(yōu)化煤蚌,所以我今天就就從最開始的快速排序到最終版本的三路快速排序分別給大家呈現(xiàn)出來,優(yōu)化的過...
    再見遠洋閱讀 1,397評論 0 5
  • 快速排序是當遇到較大數(shù)據(jù)時,排序快,高效的方法(公司面試時,基本上會被問到...) 該方法的基本思想是: 1.先從...
    悲傷C小調閱讀 873評論 0 1
  • 快速排序是當遇到較大數(shù)據(jù)時,排序快,高效的方法(公司面試時,基本上會被問到...)該方法的基本思想是: 1.先從數(shù)...
    LeafRead閱讀 1,061評論 0 1