成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你可能不知道的快速排序:三路快排

開發 前端
快速排序是對冒泡排序的一種改進。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一不部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

[[345939]]

 快速排序
快速排序是什么 快速排序是圖靈獎得主C. A. R. Hoare(1934--)于1960時提出來的。

[[345940]]

快速排序是對冒泡排序的一種改進。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一不部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。整個排序過程只需要三步:

  • 在數據集之中,選擇一個元素作為"基準"(pivot)。
  • 所有小于"基準"的元素,都移到"基準"的左邊;所有大于"基準"的元素,都移到"基準"的右邊。
  • 對"基準"左邊和右邊的兩個子集,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。

引自wikipedia 快速排序(英語:Quicksort),又稱劃分交換排序(partition-exchange sort),一種排序算法,最早由東尼·霍爾提出。在平均狀況下,排序n個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況并不常見。事實上,快速排序通常明顯比其他Ο(n log n)算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。

步驟
找到該數組的基準點(中間數),并創建兩個空數組left和right;
遍歷數組,拿出數組中的每個數和基準點進行比較,如果比基準點小就放到left數組中,如果比基準點大就放到right數組中;
對數組left和right進行遞歸調用。
方法一

  1. function quickSort(arr) { 
  2.       if (arr.length<=1) {return arr;} 
  3.       var left = [], 
  4.         right = [], 
  5.         baseDot =Math.round(arr.length/2), 
  6.         base =arr.splice(baseDot, 1)[0]; 
  7.  
  8.       for (var i =0; i <arr.length; i++) { 
  9.         if (arr[i] < base) { 
  10.           left.push(arr[i]) 
  11.         }else { 
  12.           right.push(arr[i]) 
  13.         } 
  14.       } 
  15.  
  16.       return quickSort(left).concat([base], quickSort(right)); 
  17.     } 

實現一個quickSort的封裝,并且定義left和right,找到數組的基準點baseDot和對應的基數base,然后遍歷數組的每一項和base進行對比,最后遞歸調用,給出一個跳出條件if (arr.length <= 1) {return arr;}

方法二

  1. function quickSort(array, leftright) { 
  2.       var length =array.length; 
  3.         left =typeof left ==='number'left :0, 
  4.         right =typeof right ==='number'right : length-1; 
  5.  
  6.         if (left < right) { 
  7.             var index = left -1; 
  8.             for (var i = left; i <= right; i++) { 
  9.                 if (array[i] <= array[right]) { 
  10.                     index++; 
  11.                     var temp = array[index]; 
  12.                     array[index] = array[i]; 
  13.                     array[i] = temp
  14.                 } 
  15.             } 
  16.             quickSort(array, leftindex -1); 
  17.             quickSort(array, index +1, right); 
  18.         } 
  19.         return array; 
  20.     } 

快速排序的基本思想就是分治法

引自wikipedia 在計算機科學中,分治法是建基于多項分支遞歸的一種很重要的算法范式。字面上的解釋是“分而治之”,就是把一個復雜的問題分成兩個或更多的相同或相似的子問題,直到最后子問題可以簡單的直接求解,原問題的解即子問題的解的合并。

快速排序的改進方法:三路快排
定義
三路快速排序是快速排序的的一個優化版本, 將數組分成三段, 即小于基準元素、 等于 基準元素和大于基準元素, 這樣可以比較高效的處理數組中存在相同元素的情況,其它特征與快速排序基本相同。

我這里簡單概括一下思路,有興趣的同學可到上面的鏈接上閱讀:[快速排序及優化(Java實現)][Java]

  • 隨機選取基準值base(支點隨機選取),參考[快速排序算法的優化思路總結][Link 1]
  • 配合著使用插入排序(當問題規模較小時,近乎有序時,插入排序表現的很好)
  • 當大量數據,且重復數多時,用三路快排
  1. <!DOCTYPE html> 
  2.   <html> 
  3.    
  4.    <head> 
  5.     <meta charset="UTF-8"
  6.     <title></title> 
  7.     <script type="text/javascript"
  8.      console.time("test0"
  9.      function qSort(arr) { 
  10.       if(arr.length == 0) { 
  11.        return []; 
  12.       } 
  13.       var left = []; 
  14.       var right = []; 
  15.       var pivot = arr[0]; 
  16.       for(var i = 1; i < arr.length; i++) { // 注意這里的起始值,因為有一個作為flag了 
  17.        if(arr[i] < pivot) { 
  18.         left.push(arr[i]); 
  19.        } else { 
  20.         right.push(arr[i]); 
  21.        } 
  22.       } 
  23.       return [...qSort(left), pivot, ...qSort(right)]; 
  24.      } 
  25.      console.log(qSort([9, 4, 10, 3, 1, 1, 0, 10, 8, 3, 9, 9, 4, 10, 10, 9, 9, 9, 1, 0])); 
  26.      console.timeEnd("test0"
  27.     </script> 
  28.     <script type="text/javascript"
  29.      console.time("test1"
  30.      function qSort3(arr) {       //三路快排 
  31.       if(arr.length == 0) { 
  32.        return []; 
  33.       } 
  34.       var left = []; 
  35.       var center = []; 
  36.       var right = []; 
  37.       var pivot = arr[0];    //偷懶,直接取第一個,實際取值情況 參考[快速排序算法的優化思路總結] 
  38.       for(var i = 0; i < arr.length; i++) {       
  39.        if(arr[i] < pivot) { 
  40.         left.push(arr[i]); 
  41.        } else if(arr[i] == pivot) { 
  42.         center.push(arr[i]); 
  43.        } else { 
  44.         right.push(arr[i]); 
  45.        } 
  46.       } 
  47.       return [...qSort3(left), ...center, ...qSort3(right)]; 
  48.      } 
  49.      console.log(qSort3([9, 4, 10, 3, 1, 1, 0, 10, 8, 3, 9, 9, 4, 10, 10, 9, 9, 9, 1, 0])) 
  50.      console.timeEnd("test1"
  51.     </script> 
  52.    </head> 
  53.    
  54.    <body> 
  55.    </body> 
  56.    
  57.   </html> 

可以看到對有重復數據的數據優化還是很可觀的。

責任編輯:姜華 來源: JavaScript忍者秘籍
相關推薦

2012-11-23 10:57:44

Shell

2023-01-29 09:46:47

Dialog彈窗模態

2023-02-27 09:20:24

絕對定位CSS

2015-08-13 09:03:14

調試技巧

2020-01-29 19:40:36

Python美好,一直在身邊Line

2021-01-05 11:22:58

Python字符串代碼

2019-11-20 10:25:06

sudoLinux

2021-07-12 07:59:06

安全 HTML 屬性

2019-11-25 14:05:47

Python裝飾器數據

2014-12-08 10:39:15

2021-12-17 00:10:00

ChromeDevtools功能

2020-03-05 11:10:18

Left join數據庫MySQL

2018-05-10 11:50:13

Docker容器冷知識

2024-03-04 00:00:00

Kubernetes技巧API

2022-09-20 11:58:27

NpmNode.js

2010-07-29 09:18:31

Linux用戶

2016-09-05 13:14:11

2010-07-26 13:24:11

2011-02-14 16:11:44

2020-05-09 08:48:21

JavaScript原生方法代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 2021天天躁夜夜看 | 涩在线| 日本黄视频在线观看 | 精品国产欧美一区二区三区成人 | 国产一区二区三区在线 | 国产精品日韩欧美一区二区三区 | 亚洲国产精品一区二区三区 | 日本欧美大片 | 亚洲精品一区二区三区蜜桃久 | 一区二区三区免费观看 | 天天干狠狠 | 国产精品国产成人国产三级 | 日韩成人精品在线观看 | 亚洲人精品午夜 | 嫩草视频在线看 | 欧美亚洲另类丝袜综合网动图 | 久久国产精品精品 | 99这里只有精品视频 | 亚洲天堂av一区 | 免费观看一级黄色录像 | 国产亚洲日本精品 | 91精品国产综合久久久久久 | 成人影院网站ww555久久精品 | 欧美999 | www.一区二区三区.com | 日韩精品一区二区三区中文在线 | 国产一区二区在线免费观看 | 人人亚洲 | 中文在线播放 | 日韩av中文 | 亚洲国产精品人人爽夜夜爽 | 成人国产免费视频 | 中文字幕第二十页 | 精品国产一区二区三区性色 | 九九在线视频 | 日韩欧美在线观看一区 | 国产精品视频一区二区三区不卡 | 我想看国产一级毛片 | 精品欧美在线观看 | 欧美精品在线观看 | 免费一区二区三区在线视频 |