中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

深入解析桶排序算法及Node.js上JavaScript的代碼實現
來源:易賢網 閱讀:1755 次 日期:2016-07-25 16:13:32
溫馨提示:易賢網小編為您整理了“深入解析桶排序算法及Node.js上JavaScript的代碼實現”,方便廣大網友查閱!

桶排序Radix Sort算法利用分治思想將元素分入各桶中排序后匯總,以下我們就來深入解析桶排序算法及Node.js上JavaScript的代碼實現,需要的朋友可以參考下

1. 桶排序介紹

桶排序(Bucket sort)是一種基于計數的排序算法,工作的原理是將數據分到有限數量的桶子里,然后每個桶再分別排序(有可能再使用別的排序算法或是以遞回方式繼續使用桶排序進行排序)。當要被排序的數據內的數值是均勻分配的時候,桶排序時間復雜度為Θ(n)。桶排序不同于快速排序,并不是比較排序,不受到時間復雜度 O(nlogn) 下限的影響。

桶排序按下面4步進行:

(1)設置固定數量的空桶。

(2)把數據放到對應的桶中。

(3)對每個不為空的桶中數據進行排序。

(4)拼接從不為空的桶中數據,得到結果。

桶排序,主要適用于小范圍整數數據,且獨立均勻分布,可以計算的數據量很大,而且符合線性期望時間。

2. 桶排序算法演示

舉例來說,現在有一組數據[7, 36, 65, 56, 33, 60, 110, 42, 42, 94, 59, 22, 83, 84, 63, 77, 67, 101],怎么對其按從小到大順序排序呢?

名單

操作步驟說明:

(1)設置桶的數量為5個空桶,找到最大值110,最小值7,每個桶的范圍20.8=(110-7+1)/5 。

(2)遍歷原始數據,以鏈表結構,放到對應的桶中。數字7,桶索引值為0,計算公式為floor((7 – 7) / 20.8), 數字36,桶索引值為1,計算公式floor((36 – 7) / 20.8)。

(3)當向同一個索引的桶,第二次插入數據時,判斷桶中已存在的數字與新插入數字的大小,按照左到右,從小到大的順序插入。如:索引為2的桶,在插入63時,桶中已存在4個數字56,59,60,65,則數字63,插入到65的左邊。

(4)合并非空的桶,按從左到右的順序合并0,1,2,3,4桶。

(5)得到桶排序的結構

3. Nodejs程序實現

像桶排序這種成熟的算法,自己實現一下并不難,按照上文的思路,我寫了一個簡單的程序實現。我感覺其中最麻煩的部分,是用Javascript操作鏈表。

現實代碼如下:

'use strict';

/////////////////////////////////////////////////

// 桶排序

/////////////////////////////////////////////////

var _this = this

  , L = require('linklist');//鏈表

/**

 * 普通數組桶排序,同步

 *

 * @param arr Array 整數數組

 * @param num 桶的個數

 *

 * @example:

 * sort([1,4,1,5,3,2,3,3,2,5,2,8,9,2,1],5)

 * sort([1,4,1,5,3,2,3,3,2,5,2,8,9,2,1],5,0,5)

 */

exports.sort = function (arr, count) {

  if (arr.length == 0) return [];

  count = count || (count > 1 ? count : 10);

  // 判斷最大值、最小值

  var min = arr[0], max = arr[0];

  for (var i = 1; i < arr.length; i++) {

    min = min < arr[i] ? min : arr[i];

    max = max > arr[i] ? max : arr[i];

  }

  var delta = (max - min + 1) / count;

  // console.log(min+","+max+","+delta);

  //初始化桶

  var buckets = [];

  //存儲數據到桶

  for (var i = 0; i < arr.length; i++) {

    var idx = Math.floor((arr[i] - min) / delta); // 桶索引

    if (buckets[idx]) {//非空桶

      var bucket = buckets[idx];

      var insert = false;//插入標石

      L.reTraversal(bucket, function (item, done) {

        if (arr[i] <= item.v) {//小于,左邊插入

          L.append(item, _val(arr[i]));

          insert = true;

          done();//退出遍歷

        }

      });

      if (!insert) { //大于,右邊插入

        L.append(bucket, _val(arr[i]));

      }

    } else {//空桶

      var bucket = L.init();

      L.append(bucket, _val(arr[i]));

      buckets[idx] = bucket; //鏈表實現

    }

  }

  var result = [];

  for (var i = 0, j = 0; i < count; i++) {

    L.reTraversal(buckets[i], function (item) {

      // console.log(i+":"+item.v);

      result[j++] = item.v;

    });

  }

  return result;

}

//鏈表存儲對象

function _val(v) {

  return {v: v}

}

運行程序:

var algo = require('./index.js');

var data = [ 7, 36, 65, 56, 33, 60, 110, 42, 42, 94, 59, 22, 83, 84, 63, 77, 67,101 ];

console.log(data);

console.log(algo.bucketsort.sort(data,5));//5個桶

console.log(algo.bucketsort.sort(data,10));//10個桶

輸出:

[ 7, 36, 65, 56, 33, 60, 110, 42, 42, 94, 59, 22, 83, 84, 63, 77, 67, 101 ]

[ 7, 22, 33, 36, 42, 42, 56, 59, 60, 63, 65, 67, 77, 83, 84, 94, 101, 110 ]

[ 7, 22, 33, 36, 42, 42, 56, 59, 60, 63, 65, 67, 77, 83, 84, 94, 101, 110 ]

需要說明的是:

(1)桶內排序,可以像程序中所描述的,在插入過程中實現;也可以插入不排序,在合并過程中,再進行排序,可以調用快度排序。

(2)鏈表,在Node的底層API中,有一個鏈表的實現,我沒有直接使用,而是通過linklist包調用的:https://github.com/nodejs/node-v0.x-archive/blob/master/lib/_linklist.js

4. 案例:桶排序統計高考分數

桶排序最出名的一個應用場景,就是統計高考的分數。一年的全國高考考生人數為900萬人,分數使用標準分,最低200 ,最高900 ,沒有小數,如果把這900萬數字進行排序,應該如何做呢?

算法分析:

(1)如果使用基于比較的排序,快速排序,平均時間復雜度為O(nlogn) = O(9000000*log9000000)=144114616=1.44億次比較。

(2)如果使用基于計數的排序,桶排序,平均的時候復雜度,可以控制在線性復雜度,當創建700桶時從200分到900分各一個桶,O(N)=O(9000000),就相當于掃描一次900W條數據。

我們跑一個程序,對比一次快速排序和桶排序。

//產生100W條,[200,900]閉區間的數據

var data = algo.data.randomData(1000*1000,200,900);

var s1 = new Date().getTime();

algo.quicksort.sort(data);//快速排序

var s2 = new Date().getTime();

algo.bucketsort.sort(data,700);//裝到700個桶

var s3 = new Date().getTime();

console.log("quicksort time: %sms",s2-s1);

console.log("bucket time: %sms",s3-s2);

輸出:

quicksort time: 14768ms

bucket time: 1089ms

所以,對于高考計分的案例來說,桶排序是更適合的!我們把合適的算法,用在適合的場景,會給程序帶來超越硬件的性能提升。

5. 桶排序代價分析

BUT....

桶排序利用函數的映射關系,減少了幾乎所有的比較工作。實際上,桶排序的f(k)值的計算,其作用就相當于快排中劃分,已經把大量數據分割成了基本有序的數據塊(桶)。然后只需要對桶中的少量數據做先進的比較排序即可。

對N個關鍵字進行桶排序的時間復雜度分為兩個部分:

(1) 循環計算每個關鍵字的桶映射函數,這個時間復雜度是O(N)。

(2) 利用先進的比較排序算法對每個桶內的所有數據進行排序,其時間復雜度為  ∑ O(Ni*logNi) 。其中Ni 為第i個桶的數據量。

很顯然,第(2)部分是桶排序性能好壞的決定因素。盡量減少桶內數據的數量是提高效率的唯一辦法(因為基于比較排序的最好平均時間復雜度只能達到O(N*logN)了)。因此,我們需要盡量做到下面兩點:

(1) 映射函數f(k)能夠將N個數據平均的分配到M個桶中,這樣每個桶就有[N/M]個數據量。

(2) 盡量的增大桶的數量。極限情況下每個桶只能得到一個數據,這樣就完全避開了桶內數據的“比較”排序操作。 當然,做到這一點很不容易,數據量巨大的情況下,f(k)函數會使得桶集合的數量巨大,空間浪費嚴重。這就是一個時間代價和空間代價的權衡問題了。

對于N個待排數據,M個桶,平均每個桶[N/M]個數據的桶排序平均時間復雜度為:

O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM)

當N=M時,即極限情況下每個桶只有一個數據時。桶排序的最好效率能夠達到O(N)。

6. 總結

桶排序的平均時間復雜度為線性的O(N+C),其中C=N*(logN-logM)。如果相對于同樣的N,桶數量M越大,其效率越高,最好的時間復雜度達到O(N)。 當然桶排序的空間復雜度 為O(N+M),如果輸入數據非常龐大,而桶的數量也非常多,則空間代價無疑是昂貴的。此外,桶排序是穩定的。

其實我個人還有一個感受:在查找算法中,基于比較的查找算法最好的時間復雜度也是O(logN)。比如折半查找、平衡二叉樹、紅黑樹等。但是Hash表卻有O(C)線性級別的查找效率(不沖突情況下查找效率達到O(1))。大家好好體會一下:Hash表的思想和桶排序是不是有一曲同工之妙呢?

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久综合九色欧美综合狠狠| 亚洲自拍高清| 国内激情久久| 午夜激情综合网| 欧美激情无毛| 一区精品在线| 免费成人黄色| 在线免费日韩片| 欧美大片在线观看一区二区| 亚洲青色在线| 国产精品草草| 久久久精彩视频| 一区二区三区在线免费视频| 久久久亚洲人| 日韩视频在线免费观看| 国产精品福利网站| 欧美专区福利在线| 亚洲国产精品久久久久| 欧美精品九九99久久| 亚洲性感激情| 国产真实久久| 欧美美女日韩| 久久综合九色综合欧美就去吻 | 欧美一区二区性| 欧美三级乱码| 一区二区三区精密机械公司| 欧美日韩在线一区二区三区| 亚洲欧美日韩精品在线| 国产亚洲综合精品| 欧美不卡视频| 久久阴道视频| 亚洲一区二区三区色| 国产日韩一区二区三区在线播放| 久久国产一区二区| 亚洲欧洲在线观看| 国内精品模特av私拍在线观看| 久久婷婷av| 国产女人aaa级久久久级| 久久久www免费人成黑人精品| 欧美在线视频导航| 亚洲无亚洲人成网站77777| 欧美激情一区二区三区蜜桃视频| 亚洲自拍另类| 欧美视频第二页| 一本色道久久综合亚洲精品婷婷| 国产精品影院在线观看| 欧美精品色综合| 巨乳诱惑日韩免费av| 欧美在线地址| 亚洲欧美视频一区二区三区| 91久久午夜| 在线精品亚洲| 激情自拍一区| 国产精品午夜在线| av成人毛片| 最新日韩欧美| 亚洲欧洲日本一区二区三区| 激情成人综合| 国内揄拍国内精品少妇国语| 国产日韩精品一区二区| 国产欧美韩国高清| 国产有码在线一区二区视频| 国产精品乱码一区二三区小蝌蚪 | 国产精品综合色区在线观看| 国产精品卡一卡二卡三| 欧美日韩午夜视频在线观看| 欧美福利视频在线| 欧美激情一区二区三区在线视频观看| 久久久久久久久伊人| 久久久精品动漫| 嫩草成人www欧美| 欧美国产激情二区三区| 亚洲欧洲在线视频| 日韩视频三区| 亚洲小少妇裸体bbw| 欧美一级播放| 欧美成人四级电影| 欧美日韩不卡一区| 国产精品久久久久天堂| 国产视频一区免费看| 国内精品久久久久久久影视麻豆| 国产日韩欧美黄色| 亚洲欧美激情视频| 久久嫩草精品久久久久| 久久精品91久久久久久再现| 久久夜色精品| 好吊一区二区三区| 亚洲一二三级电影| 欧美伦理影院| 99精品视频网| 欧美三级欧美一级| 亚洲午夜国产成人av电影男同| 久久综合网络一区二区| 亚洲视频在线视频| 一区二区免费看| 欧美一级专区免费大片| 久久久久久久久综合| 欧美精品系列| 国产欧美日本一区视频| 一区二区在线视频| 在线视频精品一| 国产精品电影观看| 欧美日韩国产综合视频在线观看中文| 国产原创一区二区| 亚洲影音先锋| 国产精品播放| 亚洲午夜精品一区二区| 欧美激情综合五月色丁香| 亚洲网站在线| 一区二区三区亚洲| 美玉足脚交一区二区三区图片| 国产一区二区成人久久免费影院| 亚洲精品久久久久久久久久久久| 久久精品99国产精品| 欧美无乱码久久久免费午夜一区| 亚洲视频电影图片偷拍一区| 国产精品色网| 亚洲卡通欧美制服中文| 欧美不卡一区| 国产一区日韩二区欧美三区| 91久久夜色精品国产九色| 亚洲精品欧美激情| 欧美激情一区二区三区不卡| 在线中文字幕日韩| 欧美综合77777色婷婷| 欧美日韩日本网| 国产欧美va欧美va香蕉在| 在线成人h网| 欧美在线免费观看| 欧美激情在线观看| 亚洲国产欧美在线人成| 亚洲五月六月| 在线看无码的免费网站| 一本大道久久a久久精品综合| 狂野欧美激情性xxxx| 欧美精品免费播放| 先锋影院在线亚洲| 亚洲精品国久久99热| 欧美新色视频| 欧美电影免费观看网站| 99国产精品久久久久久久| 国产欧美日韩视频一区二区三区 | 亚洲欧美在线一区| 亚洲国产日韩欧美在线动漫 | 久久裸体艺术| 国产精品r级在线| 亚洲片在线观看| 久久一区视频| 国产亚洲毛片在线| 欧美亚洲一区二区在线| 国产精品第一区| 亚洲午夜电影| 欧美日韩国产一区精品一区| 国产日韩欧美精品在线| 亚洲欧美在线网| 国产欧美成人| 午夜在线精品| 国产精品嫩草久久久久| 亚洲视频香蕉人妖| 欧美日韩在线看| 激情欧美一区| 久久av资源网| 好吊视频一区二区三区四区| 欧美一区二区三区日韩视频| 欧美精品一区二区三区在线播放 | 欧美日韩国产专区| 91久久在线| 欧美精品一区二区蜜臀亚洲| 在线欧美视频| 久久深夜福利| 极品尤物av久久免费看| 欧美精品一区二区蜜臀亚洲| 99国产精品私拍| 国产日韩精品一区二区三区在线| 欧美一区二区私人影院日本 | 国一区二区在线观看| 麻豆乱码国产一区二区三区| 亚洲高清久久网| 欧美精品乱码久久久久久按摩| 中文日韩在线| 欧美三级第一页| 亚洲欧美日本精品| 国产精品一级| 久久久亚洲国产美女国产盗摄| 亚洲高清免费视频| 欧美大片在线看| 亚洲毛片在线观看| 国产精品青草综合久久久久99| 最新亚洲激情| 国产精品久久午夜| 亚洲一区二区高清| 国产午夜精品麻豆| 欧美大片一区二区三区| 亚洲一区二区三区精品在线观看| 国产美女扒开尿口久久久| 久久综合九色欧美综合狠狠| 一区二区高清视频| 国产一区二区丝袜高跟鞋图片| 久久国产视频网| 日韩午夜免费视频|