O (n) 의 정렬 알고리즘 - (계수 정렬, 통 정렬 및 js 구현)
3863 단어 데이터 구조
계수 정렬 (Counting sort)
function countSort(nums) {
if (nums.length <= 1) return;
let max = nums[0];
let min = nums[0];
for (let i = 1; i < nums.length; i++) {
max = nums[i] <= max ? max : nums[i];
min = nums[i] >= min ? min : nums[i];
}
//
let offset = 0 - min;
//
let count = new Array(max - min + 1);
for (let i = 0; i < count.length; i++) count[i] = 0;
// :
for (let i = 0; i < nums.length; i++) {
count[nums[i] + offset]++;
}
//
let index = 0;
for (let i = 0; i < count.length; i++) {
while (count[i] > 0) {
nums[index] = i - offset;
index++;
count[i]--;
}
}
}
통 정렬 (Bucket sort)
, getBucketIndex , ;
, ,
, , , ,
, , , ,
// ,
function ListNode(val) {
this.val = val;
this.next = null;
}
// nums , , [0,10]
// len:
function bucketSort(nums, len) {
console.log(nums, len);
if (nums.length <= 1) return;
let bucket = [];
for (let i = 0; i < len; i++) {
bucket[i] = new ListNode(0);
}
//
for (const num of nums) {
//
let idx = getBucketIndex(num);
let insertNode = new ListNode(num);
if (bucket[idx].next == null) {
// ,
bucket[idx].next = insertNode;
} else {
// ,
let pre = bucket[idx];
let cur = pre.next;
while (cur != null && cur.val <= num) {
pre = cur;
cur = cur.next;
}
insertNode.next = cur;
pre.next = insertNode;
}
}
//
let index = 0;
for (let i = 0; i < len; i++) {
let node = bucket[i].next;
if (node == null) continue;
while (node != null) {
nums[index] = node.val;
index++;
node = node.next;
}
}
}
//
// , , ,
function getBucketIndex(num) {
return parseInt(num);
}
let array = [2.18, 0.18, 0.16, 2.12, 3.66, 7.88, 7.99, 8.12, 9.66, 5.1, 4.12, 5.28];
bucketSort(array, 11);
console.log(array);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.