帮我写一个js的计数排序
时间: 2023-01-29 10:06:00 浏览: 98
当然可以。下面是 JavaScript 代码实现计数排序的例子:
```
function countSort(arr) {
// 找出数组中的最大值
const maxValue = Math.max(...arr);
// 初始化计数数组并将其全部赋值为 0
const counts = new Array(maxValue + 1).fill(0);
// 遍历数组,并将对应的计数数组元素加 1
for (const item of arr) {
counts[item]++;
}
// 初始化结果数组
const sortedArr = [];
// 遍历计数数组,将元素值大于 0 的数字加入结果数组
for (let i = 0; i < counts.length; i++) {
while (counts[i] > 0) {
sortedArr.push(i);
counts[i]--;
}
}
// 返回结果数组
return sortedArr;
}
```
使用方法:
```
const arr = [3, 2, 1, 4, 5, 2, 3, 1];
const sortedArr = countSort(arr);
console.log(sortedArr); // 输出:[1, 1, 2, 2, 3, 3, 4, 5]
```
相关问题
帮我写一个JS的计数排序算法,且支持负数和小数。
JavaScript 计数排序算法:
```javascript
function countingSort(arr) {
let min = Math.min(...arr);
let max = Math.max(...arr);
let range = max - min + 1;
let count = new Array(range).fill(0);
let output = new Array(arr.length);
for (let i = 0; i < arr.length; i++) {
count[arr[i] - min]++;
}
for (let i = 1; i < count.length; i++) {
count[i] += count[i - 1];
}
for (let i = arr.length - 1; i >= 0; i--) {
output[count[arr[i] - min] - 1] = arr[i];
count[arr[i] - min]--;
}
return output;
}
```
注意:
1. 计数排序的时间复杂度是O(n),但是空间复杂度是O(n+k)
2. 数组中的数字必须是整数
实现支持负数和小数,可以考虑将数组中的数字先乘以一个负数和小数,然后使用计数排序,最后再将数组中的数字除以这个负数和小数。
例如:
```javascript
const arr = [-5.5, -3.2, 0, 2.1, 5.5, 8.9];
const factor = 100; // 乘以 100,变成整数
const sortedArr = countingSort(arr.map(num => num * factor));
const result = sortedArr.map(num => num / factor);
console.log(result);
```
这样就可以支持负数和小数了。
计数排序 js代码,并通俗易懂的解释
下面是JS实现的计数排序代码及解释:
```javascript
function countingSort(arr) {
// 找出最大值和最小值
let max = arr[0], min = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
// 统计每个元素出现的次数
const counts = new Array(max - min + 1).fill(0);
for (let i = 0; i < arr.length; i++) {
counts[arr[i] - min]++;
}
// 计算前缀和
for (let i = 1; i < counts.length; i++) {
counts[i] += counts[i - 1];
}
// 根据前缀和将元素放到有序序列中的正确位置
const result = new Array(arr.length);
for (let i = arr.length - 1; i >= 0; i--) {
result[counts[arr[i] - min] - 1] = arr[i];
counts[arr[i] - min]--;
}
return result;
}
```
该算法的主要思想是先找出待排序序列中的最大值和最小值,然后根据最大值和最小值确定统计数组的大小。接着遍历待排序序列,统计每个元素出现的次数,存入统计数组中;然后对于统计数组中的每个元素,计算其前缀和,得到每个元素在有序序列中的起始位置;最后从后往前遍历待排序序列,根据统计数组和前缀和将元素放到有序序列中的正确位置。
具体来说,我们首先遍历一遍待排序序列,找出其中的最大值和最小值,然后根据最大值和最小值确定统计数组的大小。然后我们再遍历一遍待排序序列,统计每个元素出现的次数,存入统计数组中。接着我们计算统计数组的前缀和,得到每个元素在有序序列中的起始位置。最后,从后往前遍历待排序序列,根据统计数组和前缀和将元素放到有序序列中的正确位置。
需要注意的是,在统计数组中存放的是元素出现的次数,而不是元素本身。另外,为了避免负数索引,我们需要将所有元素减去最小值,再进行统计排序。
阅读全文