《幻塔》克羅恩盧米納號PDC2密碼分享
阿新 • • 發佈:2021-12-21
計數排序
計數排序有四個步驟:
(1)首先會對每個輸入進行頻率統計,得到元素的頻率表;
(2)然後將頻率錶轉換為該元素的開始索引;
(3)根據各個元素的開始索引,將相同元素分類到臨時陣列中。
(4)最後將臨時陣列中的元素寫回到原陣列中。
/*計數排序*/ function countingSort(arr) { //找到最大最小值,計算差值 var max_num = Math.max.apply(Math,arr); console.log("max:"+max_num); var min_num = Math.min.apply(Math,arr); console.log("min:"+min_num); var len = max_num-min_num+1; //計算頻率 var count = new Array(len + 1); count.fill(0); //填充0 for (let i = 0; i < arr.length; i++) { //使用加1的索引,有重複的地方自增 count[arr[i]-min_num+1]++; } console.log("count:"+count); //計算開始索引 for (let i = 0; i < count.length-1; i++) { count[i+1] += count[i]; } console.log("count:"+count); //元素按照開始索引分類,用到一個臨時陣列 var result = new Array(arr.length); for (let i = 0; i < arr.length; i++) { // 填充一個數據後,count[i]自增,以便相同的資料可以填到下一個空位 result[count[arr[i]-min_num]++] = arr[i]; } for (var i = 0; i < arr.length; i++) { arr[i] = result[i]; } } var arr = [3,2,5,4,6,1,9,5,3,0,1]; countingSort(arr); console.log(arr);