JavaScript实现基础排序算法的示例详解

目录
  • 前言
  • 正文
    • 1、冒泡排序
    • 2、选择排序
    • 3、插入排序
    • 4、快速排序

前言

文本来总结常见的排序算法,通过 JvavScript  来实现

正文

1、冒泡排序

算法思想:比较相邻两个元素的大小,如果第一个比第二个大,就交换它们。从头遍历到尾部,当一轮遍历完后,数组最后一个元素是最大的。除去最后一个元素,对剩下的元素重复执行上面的流程,每次找出剩余元素中最大的,遍历完后,数组是升序的

算法分析:总共需要进行length * (length - 1) / 2 次比较,所以时间复杂度为O(n^2),因为只需要有一个存放常量的空间,元素本身在原数组上进行交换,所以空间复杂度为O(1)

function bubbleSort(array) {
            if (!Array.isArray(array)) {
                throw new Error('参数必须为数组');
                return;
            }
            var n = 0, m = 0 // n表示趟数,m表示比较次数
            for (let i = array.length - 1; i > 0; i--) { // 外层for表示遍历的趟数
                for (let j = 0; j < i; j++) { // 内层for表示每趟需要比较的 j 和 j+1 对应的数
                    if (arr[j] > arr[j + 1]) {
                        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
                    }
                    m++
                }
                n++
            }
            console.log("遍历趟数" + n, "比较次数" + m);//遍历趟数8 比较次数36
            return array
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(bubbleSort(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]

我们在每一轮循环中,可以记住最后一次交换的元素,这之后的元素就肯定是已经排完序的,这样可以减少总的循环次数

function bubbleSort2(array) {
            if (!Array.isArray(array)) {
                throw new Error('参数必须为数组');
                return;
            }
            var n = 0, m = 0 // n表示趟数,m表示比较次数
            for (var i = array.length - 1; i > 0;) { // 用来表示遍历 n-1 趟
                var cursor = 0;  // 用来记录本轮最后一次交换的元素位置
                for (var j = 0; j < i; j++) {
                    if (array[j] > array[j + 1]) {
                        cursor = j;
                        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
                    }
                    m++
                }
                n++
                i = cursor;

            }
            console.log("遍历趟数" + n, "比较次数" + m);//遍历趟数6 比较次数29
            return array
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(bubbleSort2(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]

2、选择排序

实现思路

(1)从头遍历到尾部,找出所有项中最大的一个元素

(2)将这个元素和第一个元素交换

(3)对剩下的元素重复进行上面的操作,每次找出剩余中最大的最后的数组是降序排列的

(4) 算法分析

总共需要进行length * (length - 1) / 2 次比较,所以时间复杂度为O(n^2),因为只需要有两个存放常     量的空间,元素本身在原数组上进行交换,所以空间复杂度为O(1)

function selectSort(array) {
            if (!Array.isArray(array)) {
                throw new Error('参数必须为数组');
                return;
            }
            for (let i = 0; i < array.length; i++) {
                var maxIndex = i, maxValue = array[i] // 设置i为最大元素下标
                // 找出剩下元素中的最大值,第一次循环找出最大值
                for (let j = i + 1; j < array.length; j++) {
                    if (array[j] > maxValue) {
                        maxIndex = j
                        maxValue = array[j]
                    }
                }
                // 如果剩下的元素中最大值下标大于i则发生交换
                if (maxIndex > i) {
                    [array[i], array[maxIndex]] = [array[maxIndex], array[i]]
                }
            }
            return array
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(selectSort(arr)); //[45, 24, 9, 8, 7, 6, 3, 1, 0]

3、插入排序

实现思路

(1)将数组前面部分看做有序数组

(2)每次将后面部分的第一个与已排序数组作比较,插入到合适的位置

(3)有序数组初始状态有1个数字

(4)算法分析

(5)时间复杂度为O(n^2)

function insertSort(array) {
            if (!Array.isArray(array)) {
                throw new Error('参数必须为数组');
                return;
            }
            for (var i = 1; i < array.length; i++) {
                var temp = array[i] //当前值
                for (var j = i; j > 0 && temp < array[j - 1]; j--) {
                    // 当前值和之前的每个值进行比较,发现有比当前值小的值就进行重新赋值
                    array[j] = array[j - 1];
                }
                array[j] = temp;
            }
            return array;
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(insertSort(arr)); //[45, 24, 9, 8, 7, 6, 3, 1, 0]

4、快速排序

算法思想:将数组的第一个数字作为基准,最后使得基准数字位于数组中间某个位置,它的左边的数字都比它小,它的右边的数字都比它大。

算法实现:设置两个分别指向数组头部和尾部的指针i和j,首先向左移动j,使得array[j] 小于基准。然后向右移动i,使得array[i] 大于基准,交换这两个元素。当i 和j 的值相等时,交换基准与位置i上的元素,然后对i左边以及右边的元素分别进行快速排序。

function quickSort(array) {
            const sort = function (arr, left = 0, right = arr.length - 1) {
                if (left >= right) {// 递归退出条件
                    return
                }
                let i = left, j = right // 定义两个指针
                let pivot = arr[i] // 定义基准数据

                while (i < j) { // 把所有比基准数
                    while (j > i && arr[j] >= pivot) { //找到一个比基准值小的数位置为j
                        j--
                    }
                    arr[i] = arr[j] // 将j的值给了i位置的元素,此时j位置还是原来的数
                    while (i < j && arr[i] < pivot) {
                        i++
                    }
                    arr[j] = arr[i] // 将i位置的值给了j位置的元素,此时i的位置还是原来的数
                }
                // 本次交换完毕,此时ij两个指针重合,把基准值赋值给i即可
                arr[i] = pivot
                sort(arr, left, j - 1) // 将左边的无序数组重复上面的操作
                sort(arr, j + 1, right) // 将右边的无序数组重复上面的操作
            }
            const newArr = array.concat() // 为了保证这个函数是纯函数拷贝一次数组
            sort(newArr)
            return newArr
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(quickSort(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]

到此这篇关于JavaScript实现基础排序算法的示例详解的文章就介绍到这了,更多相关JavaScript排序算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript数组排序的六种常见算法总结

    前言 着急用的话,选择前两个就行了,后面的看看就好. 开发中,遇到数组排序的需求很频繁,这篇文章会介绍几个常见排序思路. 一.希尔排序(性能最好) 如果要从大到小排列,则 while(arr[n] > arr[n - interval] && n > 0) . // 希尔排序算法 function xier(arr){ var interval = parseInt(arr.length / 2);//分组间隔设置 while(interval > 0){ for(var

  • JavaScript实现的七种排序算法总结(推荐!)

    目录 前言 冒泡排序 基础算法 第二种写法是在基础算法的基础上改良而来的: 选择排序 基础算法 二元选择排序-优化 插入排序 交换法插入排序 移动法 希尔排序 堆排序 快速排序 归并排序 总结 前言 所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率.对于排序,我们首先要求其具有一定的稳定性,即当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前

  • JS实现的随机排序功能算法示例

    本文实例讲述了JS实现的随机排序功能算法.分享给大家供大家参考,具体如下: 使用JS编写一个方法 让数组中的元素每次刷新随机排列 方法一: var arr =[1,2,3,4]; var t; for(var i = 0;i < arr.length; i++){ var rand = parseInt(Math.random()*arr.length); t = arr[rand]; arr[rand] =arr[i]; arr[i] = t; } console.log(arr); 方法二:

  • JavaScript实现的九种排序算法

    前言 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. 下面话不多说了,来一起看看详细的介绍吧 一.代码汇总(一) 1.冒泡排序 2.改进版冒泡排序 3.选择排序 4.直接插入排序 5.二分插入排序 /* * @Author: laifeipeng * @Date: 2019-02-20 10:00:36 * @Last Modified by: laifeipeng * @Last Modified tim

  • 如何利用JavaScript实现排序算法浅析

    目录 冒泡排序 选择排序 插入排序 总结 冒泡排序 冒泡排序就是重复从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置. JavaScript代码实现: 代码简介:声明一个数组变量,通过while给数组变量赋值,当输入"#"时停止输入,然后遍历相邻的两个数,让相邻的两个数升序排列,遍历n-1次实现排序; var a = Array(); flag=true; var i = 0; var j = 0; var temp = 0; while(flag){ var b =

  • 通过实例解析JavaScript常用排序算法

    冒泡排序 冒泡排序是我们在编程算法中,算是比较常用的排序算法之一,在学习阶段,也是最需要接触理解的算法,所以我们放在第一个来学习. 算法介绍: 比较相邻的两个元素,如果前一个比后一个大,则交换位置.第一轮把最大的元素放到了最后面.由于每次排序最后一个都是最大的,所以之后按照步骤1排序最后一个元素不用比较. 冒泡算法改进: 设置一个标志,如果这一趟发生了交换,则为true.否则为false.如果这一趟没有发生交换,则说明排序已经完成.代码如下: 假如数组长度是20,如果只有前十位是无序排列的,后十

  • javascript基本常用排序算法解析

    备注:内容大部分从网上复制,代码为自己手写.仅做知识的温故知新,并非原创. 1.冒泡排序(Bubble Sort) (1)算法描述 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. (2)算法描述和实现 具体算法描述如下: <1>.比较相邻的元素.如果第一个比第二个大,就

  • JavaScript实现基础排序算法的示例详解

    目录 前言 正文 1.冒泡排序 2.选择排序 3.插入排序 4.快速排序 前言 文本来总结常见的排序算法,通过 JvavScript  来实现 正文 1.冒泡排序 算法思想:比较相邻两个元素的大小,如果第一个比第二个大,就交换它们.从头遍历到尾部,当一轮遍历完后,数组最后一个元素是最大的.除去最后一个元素,对剩下的元素重复执行上面的流程,每次找出剩余元素中最大的,遍历完后,数组是升序的 算法分析:总共需要进行length * (length - 1) / 2 次比较,所以时间复杂度为O(n^2)

  • C语言实现冒泡排序算法的示例详解

    目录 1. 问题描述 2. 问题分析 3. 算法设计 动图演示 4. 程序设计 设计一 设计二 结论 5. 流程框架 6. 代码实现 7. 问题拓展 1. 问题描述 对N个整数(数据由键盘输入)进行升序排列. 2. 问题分析 对于N个数因其类型相同,我们可利用 数组 进行存储. 冒泡排序是在 两个相邻元素之间进行比较交换的过程将一个无序表变成有序表. 冒泡排序的思想:首先,从表头开始往后扫描数组,在扫描过程中逐对比较相邻两个元素的大小. 若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,

  • Python中八大图像特效算法的示例详解

    目录 0写在前面 1毛玻璃特效 2浮雕特效 3油画特效 4马赛克特效 5素描特效 6怀旧特效 7流年特效 8卡通特效 0 写在前面 图像特效处理是基于图像像素数据特征,将原图像进行一定步骤的计算——例如像素作差.灰度变换.颜色通道融合等,从而达到期望的效果.图像特效处理是日常生活中应用非常广泛的一种计算机视觉应用,出现在各种美图软件中,这些精美滤镜背后的数学原理都是相通的,本文主要介绍八大基本图像特效算法,在这些算法基础上可以进行二次开发,生成更高级的滤镜. 本文采用面向对象设计,定义了一个图像

  • C++实现贪心算法的示例详解

    目录 区间问题 区间选点 最大不相交区间数量 区间分组 区间覆盖 Huffman树 合并果子 排序不等式 排队打水 绝对值不等式 货舱选址 区间问题 区间选点 给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点. 输出选择的点的最小数量. 位于区间端点上的点也算作区间内. 输入格式 第一行包含整数 N,表示区间数. 接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点. 输出格式 输出一个整数,表示所需的点的最小数量. 数据范围 1

  • C++递归与分治算法原理示例详解

    目录 1. 汉诺塔问题 2. 全排列问题 4. 归并排序 5. 快速排序 6. 棋盘覆盖问题 1. 汉诺塔问题 递归算法,分为 3 步:将 n 个 a 上的盘子借助 c 移动到 b ① 将 n-1 个 a 上的盘子借助 b 移动到 c ② 将 a 上的盘子移动到 b ③ 将 c 上的 n-1 个盘子借助 a 移动到 b 所有盘子都移动到 b 上了 void hanoi(int n,char a,char b,char c)//将n个碟子从a借助c 移到b { if(n==0) return; e

  • Go语言基础单元测试与性能测试示例详解

    目录 概述 单元测试 代码说明如下 问题 注意 性能测试 基本使用 自定义测试时间 概述 测试不是Go语言独有的,其实在很多语言都有测试,例如:Go.Java.Python- 要想成为一名合格的大牛,这是程序员必须具备的一项技能,特别是一些大公司,这是加分的一项,主要有如下优点: 代码可以随时测试,保证代码不会产生错误 写出更加高效的代码 testing文档 Testing_flags文档 单元测试 格式:func TestXXX(t *testing.T) //add.go package c

  • Go语言基础go接口用法示例详解

    目录 概述 语法 定义接口 实现接口 空接口 接口的组合 总结 概述 Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,不包含变量. 语法 定义接口 type [接口名] interface { 方法名1(参数列表) 返回值列表 方法名2(参数列表) 返回值列表 ... } 例子 type Isay interface{ sayHi() } 实现接口 例子 //定义接口的实现类 type Chinese struct{} //实现接口 func (_ *Chinese) sayHi(

  • Go语言基础map用法及示例详解

    目录 概述 语法 声明和初始化 读取 删除 遍历 总结 示例 概述 map是基于key-value键值对的无序的集合 Go语言中的map是引用类型 必须初始化才能使用. 语法 声明和初始化 配合make使用,否则是nil var map[KeyType]ValueType //KeyType:表示键的类型 //ValueType:表示键对应的值的类型 make(map[KeyType]ValueType, [cap]) //cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map

  • Go语言基础数组用法及示例详解

    目录 概述 语法 注意 示例 概述 固定长度,数组声明后长度便不能再修改 只能存储一种特定类型元素的序列 语法 编号 方式 代码示例 1 直接声明 var arr [3]int 2 make arr:=make([]int,3) 3 字面量 arr:=[3]int{1,2,3} 4 自动识别长度 arr:=[-]int{1,2,3} 5 二维数组 arr := [4][4]int{{1}, {1, 2}, {1, 2, 3}} 6 new arrp := new([10]int) 7 下标取值

  • JavaScript事件的委托(代理)的用法示例详解

    目录 简介 示例:事件委托 写法1:事件委托 写法2:每个子元素都绑定事件 示例:新增元素 写法1:事件委托 写法2:每个子元素都绑定事件 简介 说明 本文用示例介绍JavaScript中的事件(Event)的委托(代理)的用法. 事件委托简介 事件委托,也叫事件代理,是JavaScript中绑定事件的一种常用技巧.就是将原本需要绑定在子元素的响应事件委托给父元素或更外层元素,让外层元素担当事件监听的职务. 事件代理的原理是DOM元素的事件冒泡. 事件委托的优点 1.节省内存,减少事件的绑定 原

随机推荐