JavaScript实现的七种排序算法总结(推荐!)
简介
本文介绍了JavaScript实现的七种排序算法,包括插入排序、冒泡排序、选择排序、希尔排序、归并排序、快速排序和堆排序。每种算法都有对应的JavaScript代码实现,并且详细说明了算法的原理、时间复杂度和代码实现过程。
插入排序
插入排序是一种简单的排序算法,它的基本思想是将数组分成已排序和未排序两部分,遍历未排序部分的每一个元素,将其插入到已排序部分的合适位置。
时间复杂度:O(n^2)
JavaScript代码实现:
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
for (let j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
}
}
return arr;
}
示例说明:
let arr = [4, 2, 5, 3, 1];
console.log(insertionSort(arr)); // 输出 [1, 2, 3, 4, 5]
冒泡排序
冒泡排序是一种运算简单的排序算法,它的基本思想是遍历数组,将相邻的两个元素进行比较,如果顺序不对就交换位置,直到整个数组都是有序的。
时间复杂度:O(n^2)
JavaScript代码实现:
function bubbleSort(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
示例说明:
let arr = [4, 2, 5, 3, 1];
console.log(bubbleSort(arr)); // 输出 [1, 2, 3, 4, 5]
选择排序
选择排序是一种简单而直观的排序算法,它的基本思想是每次从未排序的数组中选出一个最小值,插入到已排序数组的末尾。
时间复杂度:O(n^2)
JavaScript代码实现:
function selectionSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
let minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (i !== minIndex) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
}
return arr;
}
示例说明:
let arr = [4, 2, 5, 3, 1];
console.log(selectionSort(arr)); // 输出 [1, 2, 3, 4, 5]
希尔排序
希尔排序是一个高效的插入排序算法,它的基本思想是先将待排序的数组按照一定的间隔分成若干个子数组,对每个子数组进行插入排序,随着间隔的逐渐缩小,子数组的个数也逐渐减少,最终达到对整个数组进行排序的目的。
时间复杂度:O(n^1.3)
JavaScript代码实现:
function shellSort(arr) {
const len = arr.length;
for (let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
for (let i = gap; i < len; i++) {
let j = i;
while (j - gap >= 0 && arr[j] < arr[j - gap]) {
[arr[j], arr[j - gap]] = [arr[j - gap], arr[j]];
j -= gap;
}
}
}
return arr;
}
示例说明:
let arr = [4, 2, 5, 3, 1];
console.log(shellSort(arr)); // 输出 [1, 2, 3, 4, 5]
归并排序
归并排序是一种基于分治思想的排序算法,它的基本思想是将一个大问题拆分成若干个小问题,然后对每个小问题进行排序,最后将所有小问题的排序结果合并成一个有序序列。
时间复杂度:O(nlogn)
JavaScript代码实现:
function mergeSort(arr) {
if (arr.length < 2) {
return arr;
}
const mid = Math.floor(arr.length / 2);
const left = arr.slice(0, mid);
const right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
const result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length) {
result.push(left.shift());
}
while (right.length) {
result.push(right.shift());
}
return result;
}
示例说明:
let arr = [4, 2, 5, 3, 1];
console.log(mergeSort(arr)); // 输出 [1, 2, 3, 4, 5]
快速排序
快速排序是一种高效的排序算法,它的基本思想是通过一次遍历将待排序数组分为两个部分,一部分比基准值小,一部分比基准值大,然后递归地对每个子数组进行上述操作,直到所有子数组都有序。
时间复杂度:O(nlogn)
JavaScript代码实现:
function quickSort(arr) {
if (arr.length < 2) {
return arr;
}
const pivot = arr[0];
const left = [];
const right = [];
for (let i = 1; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return [...quickSort(left), pivot, ...quickSort(right)];
}
示例说明:
let arr = [4, 2, 5, 3, 1];
console.log(quickSort(arr)); // 输出 [1, 2, 3, 4, 5]
堆排序
堆排序是一种树形选择排序算法,它的基本思想是将待排序序列构造成一个大顶堆或小顶堆,然后每次取出堆顶元素,再调整堆结构,直到整个序列有序。
时间复杂度:O(nlogn)
JavaScript代码实现:
function heapSort(arr) {
buildHeap(arr);
for (let i = arr.length - 1; i >= 0; i--) {
[arr[0], arr[i]] = [arr[i], arr[0]];
heapify(arr, i, 0);
}
return arr;
}
function buildHeap(arr) {
const len = arr.length;
for (let i = Math.floor(len / 2); i >= 0; i--) {
heapify(arr, len, i);
}
}
function heapify(arr, len, i) {
let largest = i;
const left = 2 * i + 1;
const right = 2 * i + 2;
if (left < len && arr[left] > arr[largest]) {
largest = left;
}
if (right < len && arr[right] > arr[largest]) {
largest = right;
}
if (largest !== i) {
[arr[i], arr[largest]] = [arr[largest], arr[i]];
heapify(arr, len, largest);
}
}
示例说明:
let arr = [4, 2, 5, 3, 1];
console.log(heapSort(arr)); // 输出 [1, 2, 3, 4, 5]
总结
上文介绍了JavaScript实现的七种排序算法,并且提供了每个算法的JavaScript代码实现和时间复杂度分析,希望可以对读者有所帮助。在实际应用中,选择合适的排序算法可以大幅度提高运行效率,是一项重要的编程技能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现的七种排序算法总结(推荐!) - Python技术站