📅  最后修改于: 2023-12-03 14:49:41.686000             🧑  作者: Mango
计数排序是一种非比较排序算法,其基本思想是统计待排序数组中每个元素出现的次数,然后根据出现次数依次放到有序的结果数组中。计数排序只能用在数据范围不大的场景中,如果数据范围比较大,需要使用基数排序。本文将会介绍如何使用 JavaScript 实现计数排序,并结合可视化的方式帮助理解算法过程。
以下是使用 JavaScript 进行计数排序的可视化效果预览:
首先,我们需要实现计数排序的主要逻辑。以下是使用 JavaScript 实现计数排序的代码:
function countingSort(array) {
if (array.length < 2) {
return array;
}
// 确定最大值和最小值
let min = array[0];
let max = array[0];
for (let i = 1; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
}
if (array[i] > max) {
max = array[i];
}
}
// 计算元素出现的次数
const count = Array(max - min + 1).fill(0);
for (let i = 0; i < array.length; i++) {
count[array[i] - min]++;
}
// 累加次数
for (let i = 1; i < count.length; i++) {
count[i] += count[i - 1];
}
// 排序
const result = Array(array.length);
for (let i = array.length - 1; i >= 0; i--) {
result[count[array[i] - min] - 1] = array[i];
count[array[i] - min]--;
}
return result;
}
以上代码中,我们先查找数组中的最小值和最大值,然后根据最小值和最大值的范围创建一个计数数组。接着,我们遍历整个数组,计算每个元素出现的次数,然后累加次数,最后将数组按照计数数组的值进行排序。
接下来,我们需要结合可视化的方式帮助理解计数排序算法。以下是使用 JavaScript 和 HTML/CSS 实现可视化的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>计数排序可视化</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.container {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
width: 80%;
height: 80%;
}
.element {
display: flex;
justify-content: center;
align-items: center;
width: 40px;
height: 40px;
border: 1px solid black;
margin: 5px;
font-size: 20px;
}
</style>
</head>
<body>
<div class="container"></div>
<script>
// 计数排序逻辑
function countingSort(array) {
if (array.length < 2) {
return array;
}
let min = array[0];
let max = array[0];
for (let i = 1; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
}
if (array[i] > max) {
max = array[i];
}
}
const count = Array(max - min + 1).fill(0);
for (let i = 0; i < array.length; i++) {
count[array[i] - min]++;
}
for (let i = 1; i < count.length; i++) {
count[i] += count[i - 1];
}
const result = Array(array.length);
for (let i = array.length - 1; i >= 0; i--) {
result[count[array[i] - min] - 1] = array[i];
count[array[i] - min]--;
}
return result;
}
// 随机生成数组
const array = [];
for (let i = 0; i < 30; i++) {
array.push(Math.floor(Math.random() * 31));
}
// 创建可视化元素
const container = document.querySelector(".container");
for (let i = 0; i < array.length; i++) {
const element = document.createElement("div");
element.className = "element";
element.style.height = `${array[i] * 20}px`; // 根据随机数设置高度
element.textContent = array[i]; // 显示随机数
container.appendChild(element);
}
// 计数排序可视化
const result = countingSort(array);
const elements = container.querySelectorAll(".element");
for (let i = 0; i < elements.length; i++) {
elements[i].style.height = `${result[i] * 20}px`; // 根据计数排序结果设置高度
elements[i].textContent = result[i]; // 显示计数排序结果
}
</script>
</body>
</html>
以上代码中,我们首先随机生成一个长度为 30 的数组,并根据数组中的随机数创建可视化元素。然后,我们使用计数排序算法对这个数组进行排序,并将排序结果可视化展示出来。
本文介绍了如何使用 JavaScript 进行计数排序,并结合可视化的方式帮助理解算法过程。当然,这只是计数排序的一个基础实现,如果读者有兴趣深入学习非比较排序算法,可以继续研究更高级的算法实现方式。