广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >利用JavaScript实现的10种排序算法总结
  • 796
分享到

利用JavaScript实现的10种排序算法总结

JavaScript排序算法JavaScript算法JavaScript排序 2023-05-19 08:05:24 796人浏览 独家记忆
摘要

目录1、冒泡排序算法2、选择排序算法3、插入排序算法4、 希尔排序算法5、归并排序算法6、 快速排序算法7、堆排序算法8、计数排序算法9、桶排序算法10、基数排序

排序算法

  • 冒泡排序算法
  • 选择排序算法
  • 插入排序算法
  • 希尔排序算法
  • 归并排序算法
  • 快速排序算法
  • 堆排序算法
  • 计数排序算法
  • 桶排序算法
  • 基数排序算法

1、冒泡排序算法

冒泡排序(Bubble Sort)是一种简单直观的排序算法。冒泡排序算法的步骤描述如下:

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

javascript实现冒泡排序算法的代码如下:

function bubbleSort(arr) {
    let len = arr.length;
    for (let i = 0; i < len - 1; i++) {
        for (let j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {        // 相邻元素两两对比
                let temp = arr[j+1];        // 元素交换
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

2、选择排序算法

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。选择排序算法的步骤描述如下:

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  • 重复第二步,直到所有元素均排序完毕。

JavaScript实现选择排序算法的代码如下:

function selectionSort(arr) {
    let len = arr.length;
    let minIndex, temp;
    for (let i = 0; i < len - 1; i++) {
        minIndex = i;
        for (let j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {     // 寻找最小的数
                minIndex = j;                 // 将最小数的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}

3、插入排序算法

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序算法的步骤描述如下:将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)JavaScript实现插入排序算法的代码如下:

function insertionSort(arr) {
    let len = arr.length;
    let preIndex, current;
    for (let i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while(preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex+1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex+1] = current;
    }
    return arr;
}

4、 希尔排序算法

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序算法的步骤描述如下:选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;按增量序列个数 k,对序列进行 k 趟排序;每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。JavaScript实现希尔排序算法的代码如下:

function shellSort(arr) {
    let len = arr.length,
        temp,
        gap = 1;
    while(gap < len/3) {          //动态定义间隔序列
        gap =gap*3+1;
    }
    for (gap; gap > 0; gap = Math.floor(gap/3)) {
        for (let i = gap; i < len; i++) {
            temp = arr[i];
            for (let j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
                arr[j+gap] = arr[j];
            }
            arr[j+gap] = temp;
        }
    }
    return arr;
}

5、归并排序算法

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。归并排序算法的步骤描述如下:

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

设定两个指针,最初位置分别为两个已经排序序列的起始位置;

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

重复步骤 3 直到某一指针达到序列尾;

将另一序列剩下的所有元素直接复制到合并序列尾。

JavaScript实现归并排序算法的代码如下:

function mergeSort(arr) {  // 采用自上而下的递归方法
    let len = arr.length;
    if(len < 2) {
        return arr;
    }
    let middle = Math.floor(len / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
}
 
function merge(left, right)
{
    let 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;
}

6、 快速排序算法

快速排序是由东尼·霍尔所发展的一种排序算法。它是处理大数据最快的排序算法之一。快速排序是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。快速排序算法的步骤描述如下:

从数列中挑出一个元素,称为 “基准”(pivot);

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

JavaScript实现快速排序算法的代码如下:

function quickSort(arr, left, right) {
    let len = arr.length,
        partitionIndex,
        left = typeof left != 'number' ? 0 : left,
        right = typeof right != 'number' ? len - 1 : right;
 
    if (left < right) {
        partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex-1);
        quickSort(arr, partitionIndex+1, right);
    }
    return arr;
}
 
function partition(arr, left ,right) {     // 分区操作
    let pivot = left,                      // 设定基准值(pivot)
        index = pivot + 1;
    for (let i = index; i <= right; i++) {
        if (arr[i] < arr[pivot]) {
            swap(arr, i, index);
            index++;
        }        
    }
    swap(arr, pivot, index - 1);
    return index-1;
}
 
function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
functiion paritition2(arr, low, high) {
  let pivot = arr[low];
  while (low < high) {
    while (low < high && arr[high] > pivot) {
      --high;
    }
    arr[low] = arr[high];
    while (low < high && arr[low] <= pivot) {
      ++low;
    }
    arr[high] = arr[low];
  }
  arr[low] = pivot;
  return low;
}
 
function quickSort2(arr, low, high) {
  if (low < high) {
    let pivot = paritition2(arr, low, high);
    quickSort2(arr, low, pivot - 1);
    quickSort2(arr, pivot + 1, high);
  }
  return arr;
}

7、堆排序算法

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆排序算法的步骤描述如下:创建一个堆 H[0……n-1];把堆首(最大值)和堆尾互换;把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;重复步骤 2,直到堆的尺寸为 1。JavaScript实现堆排序算法的代码如下:let len;    因为声明的多个函数都需要数据长度,所以把len设置成为全局变量

function buildMaxHeap(arr) {   // 建立大顶堆
    len = arr.length;
    for (let i = Math.floor(len/2); i >= 0; i--) {
        heapify(arr, i);
    }
}
 
function heapify(arr, i) {     // 堆调整
    let left = 2 * i + 1,
        right = 2 * i + 2,
        largest = i;
 
    if (left < len && arr[left] > arr[largest]) {
        largest = left;
    }
 
    if (right < len && arr[right] > arr[largest]) {
        largest = right;
    }
 
    if (largest != i) {
        swap(arr, i, largest);
        heapify(arr, largest);
    }
}
 
function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
 
function heapSort(arr) {
    buildMaxHeap(arr);
 
    for (let i = arr.length-1; i > 0; i--) {
        swap(arr, 0, i);
        len--;
        heapify(arr, 0);
    }
    return arr;
}

8、计数排序算法

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。JavaScript实现计数排序算法的代码如下:

function countingSort(arr, maxValue) {
    let bucket = new Array(maxValue+1),
        sortedIndex = 0;
        arrLen = arr.length,
        bucketLen = maxValue + 1;
 
    for (let i = 0; i < arrLen; i++) {
        if (!bucket[arr[i]]) {
            bucket[arr[i]] = 0;
        }
        bucket[arr[i]]++;
    }
 
    for (let j = 0; j < bucketLen; j++) {
        while(bucket[j] > 0) {
            arr[sortedIndex++] = j;
            bucket[j]--;
        }
    } 
    return arr;
}

9、桶排序算法

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。JavaScript实现桶排序算法的代码如下:

function bucketSort(arr, bucketSize) {
    if (arr.length === 0) {
      return arr;
    }
 
    let i;
    let minValue = arr[0];
    let maxValue = arr[0];
    for (i = 1; i < arr.length; i++) {
      if (arr[i] < minValue) {
          minValue = arr[i];                // 输入数据的最小值
      } else if (arr[i] > maxValue) {
          maxValue = arr[i];                // 输入数据的最大值
      }
    }
 
    //桶的初始化
    let DEFAULT_BUCKET_SIZE = 5;            // 设置桶的默认数量为5
    bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
    let bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;   
    let buckets = new Array(bucketCount);
    for (i = 0; i < buckets.length; i++) {
        buckets[i] = [];
    }
 
    //利用映射函数将数据分配到各个桶中
    for (i = 0; i < arr.length; i++) {
        buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
    }
 
    arr.length = 0;
    for (i = 0; i < buckets.length; i++) {
        insertionSort(buckets[i]);                      // 对每个桶进行排序,这里使用了插入排序
        for (let j = 0; j < buckets[i].length; j++) {
            arr.push(buckets[i][j]);                      
        }
    }
 
    return arr;
}

10、基数排序算法

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

JavaScript实现基数排序算法的代码如下:

let counter = [];
function radixSort(arr, maxDigit) {
    let mod = 10;
    let dev = 1;
    for (let i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
        for(let j = 0; j < arr.length; j++) {
            let bucket = parseInt((arr[j] % mod) / dev);
            if(counter[bucket]==null) {
                counter[bucket] = [];
            }
            counter[bucket].push(arr[j]);
        }
        let pos = 0;
        for(let j = 0; j < counter.length; j++) {
            let value = null;
            if(counter[j]!=null) {
                while ((value = counter[j].shift()) != null) {
                      arr[pos++] = value;
                }
          }
        }
    }
    return arr;
}

以上就是利用JavaScript实现的10种排序算法总结的详细内容,更多关于JavaScript排序算法的资料请关注编程网其它相关文章!

--结束END--

本文标题: 利用JavaScript实现的10种排序算法总结

本文链接: https://www.lsjlt.com/news/212670.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用JavaScript实现的10种排序算法总结
    目录1、冒泡排序算法2、选择排序算法3、插入排序算法4、 希尔排序算法5、归并排序算法6、 快速排序算法7、堆排序算法8、计数排序算法9、桶排序算法10、基数排序...
    99+
    2023-05-19
    JavaScript排序算法 JavaScript算法 JavaScript排序
  • JavaScript实现的七种排序算法总结(推荐!)
    目录前言冒泡排序 基础算法 第二种写法是在基础算法的基础上改良而来的:选择排序 基础算法二元选择排序-优化插入排序 交换法插入排序移动法希尔排序 堆排序 快速排序 归并排序 总结前言...
    99+
    2022-11-12
  • 详细总结各种排序算法(Java实现)
    一、插入类排序1.直接插入排序思想:将第i个插入到前i-1个中的适当位置时间复杂度:T(n) = O(n²)。空间复杂度:S(n) = O(1)。稳定性:稳定排序。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元...
    99+
    2023-05-31
    java 排序算法 ava
  • Python实现各种排序算法的代码示例总结
    在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数。《数据结构》也会花大量篇幅讲解排序。之前一段时间,由于需要,我...
    99+
    2022-06-04
    示例 算法 代码
  • 用JavaScript实现的七种排序算法
    这篇文章主要讲解了“用JavaScript实现的七种排序算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用JavaScript实现的七种排序算法”吧!目录前言冒泡排序基础算法第二种写法是在...
    99+
    2023-06-20
  • 十大排序算法总结(Python3实现)
    目录   一、概述 二、算法简介及代码展示 1.冒泡排序 2.简单选择排序 3.简单插入排序 4.堆排序 5.快速排序 6.希尔排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 11.#代码说明 三、感悟总结 排序算法大概是...
    99+
    2023-01-31
    十大 算法
  • java中几种常见的排序算法总结
    目录本节目标;【插入排序】【优化版】【希尔排序】【选择排序】【堆排序】 【冒泡排序】介绍一个冒泡排序的优化方法; 【快速排序】【归并排序】【正文】【代码简介;】&...
    99+
    2022-11-13
  • 如何利用JavaScript实现排序算法浅析
    目录冒泡排序选择排序插入排序总结冒泡排序 冒泡排序就是重复从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置。 JavaScript代码实现: 代码简介:声明一个数组...
    99+
    2022-11-12
  • 五种编程语言(Python、Java、C++、JavaScript、PHP)实现冒泡排序算法及其原理和总结
    本文介绍了五种不同编程语言(Python、Java、C++、JavaScript、PHP)实现冒泡排序算法的代码及其原理和总结。冒泡排序是一种简单的排序算法,通过重复遍历待排序的数组,每次比较相邻的两...
    99+
    2023-09-02
    算法 排序算法 数据结构
  • C语言完整实现12种排序算法(小结)
    目录1.冒泡排序2.插入排序3.折半插入排序4.希尔排序5.选择排序6.鸡尾酒排序7.堆排序8.快速排序9.归并排序10.计数排序11.桶排序12.基数排序1.冒泡排序 思路:比较相...
    99+
    2022-11-13
  • python常用的各种排序算法原理与实现方法小结
    1. 冒泡排序(Bubble Sort) 基本思想:重复地遍历待排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就交换位置,直到没有需要交换的元素为止。 实现代码: def b...
    99+
    2023-05-17
    python 排序算法
  • 总结三种常见php算法的实现方法
    PHP是一种强大的脚本语言,它在Web开发领域中广泛应用。除了在网站开发中使用,PHP还可以用于实现各种算法和数据结构。在本文中,我们将介绍三个常见的算法,包括冒泡排序、快速排序和二分查找,以及在PHP中如何实现它们。一、冒泡排序冒泡排序是...
    99+
    2023-05-14
  • JavaScript实现树结构转换的五种方法总结
    目录方法一:使用递归方法二:使用循环方法三:使用 reduce方法四:使用哈希表方法五:使用深度优先搜索总结在 JavaScript 编程中,将数组转换为树结构是一个常见的需求。本篇...
    99+
    2023-03-15
    JavaScript树结构转换 JavaScript树结构
  • c语言实现的几种常用排序算法
    概述 最近重新回顾了一下数据结构和算法的一些基本知识,对几种排序算法有了更多的理解,也趁此机会通过博客做一个总结。 1.选择排序-简单选择排序 选择排序是最简单的一种基于O(n2)时...
    99+
    2022-11-12
  • python怎么实现常用的五种排序算法
    这篇文章将为大家详细讲解有关python怎么实现常用的五种排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、冒泡排序原理:比较相邻的元素。如果第一个比第二个大就交换他们两个每一对相邻元素做同样的工...
    99+
    2023-06-20
  • 怎么在Python中利用排序算法实现插入排序
    怎么在Python中利用排序算法实现插入排序,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、插入排序插入排序与我们平时打扑克牌非常相似,将新摸到的牌插入到已有的牌中合适的位置...
    99+
    2023-06-15
  • Java常用的八种排序算法与代码实现
    目录1.直接插入排序2.希尔排序3.简单选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.基数排序1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列...
    99+
    2022-11-12
  • Python实现桶排序与快速排序算法结合应用示例
    本文实例讲述了Python实现桶排序与快速排序算法结合应用的方法。分享给大家供大家参考,具体如下: #-*- coding: UTF-8 -*- import numpy as np from Quic...
    99+
    2022-06-04
    示例 算法 快速
  • java实现的各种排序算法代码示例
    折半插入排序折半插入排序是对直接插入排序的简单改进。此处介绍的折半插入,其实就是通过不断地折半来快速确定第i个元素的插入位置,这实际上是一种查找算法:折半查找。Java的Arrays类里的binarySearch()方法,就是折半查找的实现...
    99+
    2023-05-31
    java 排序 算法
  • python如何实现常用的五种排序算法详解
    目录一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、快速排序 总结一、冒泡排序 原理: 比较相邻的元素。如果第一个比第二个大就交换他们两个 每一对相邻...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作