博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用JS实现三种基本的排序算法以及三种算法的比较
阅读量:7155 次
发布时间:2019-06-29

本文共 2729 字,大约阅读时间需要 9 分钟。

1.介绍

排序算法是算法中最常见的算法之一,我这里要介绍的是排序算法中的三种基本算法:冒泡排序、选择排序、插入排序,在文章的后面我会对三种算法的速度进行对比。

2.冒泡排序

冒泡排序其名来源与其算法实现,会使得数组中的元素一个个从数组一端漂到另一端而故这样命名。下面我们实现的是对数组就行升序排列的冒泡:

function bubbleSort(arr){    if(!arr instanceof Array){        return;    }    if(arr.length == 0 || arr.length == 1){        return arr;    }    for(let outer = arr.length; outer >= 2; outer--){        for(let inner = 0; inner <= outer - 1; inner++){            if(arr[inner] > arr[inner + 1]){                let temp = arr[inner];                arr[inner] = arr[inner + 1];                arr[inner + 1] = temp;                }        }    }    return arr;}

3.选择排序

选择排序我们也需要用到嵌套循环,算法思路如下:

从数组的第一个元素开始,将第一个元素逐个与其他元素比较,检查完所有元素后,最小的元素会放到最前面。然后从第二个元素继续,重复这一过程,直到进行到数组倒数第二个元素,排序并完成了。

外循环从数组的第一个元素移动到倒数第二个元素; 内循环从第二个数组元素移动到最后一个元素, 查找比当前外循环所指向的元素小的元素。 每次内循环迭代后, 数组中最小的值都会被赋值到合适的位置。

function selectionSort(arr){    if(!arr instanceof Array){        return;    }    if(arr.length == 0 || arr.length == 1){        return arr;    }    let min;    for(let outer = 0; outer <= arr.length - 2; outer++){        min = outer;        for(let inner = outer + 1; inner <= arr.length - 1; inner++){            if(arr[inner] < arr[min]){                min = inner;            }        }         let temp = arr[outer];         arr[outer] = arr[min];         arr[min] = temp;    }    return arr;}

4.插入排序

插入排序有两个循环。 外循环将数组元素挨个移动, 而内循环则对外循环中选中的元素及它后面的那个元素进行比较。 如果外循环中选中的元素比内循环中选中的元素小, 那么数组元素会向右移动, 为内循环中的这个元素腾出位置。

function insertionSort(arr){    if(!arr instanceof Array){        return;    }    if(arr.length == 0 || arr.length == 1){        return arr;    }    let temp,inner;    for(let outer = 0; outer < arr.length; outer++){        temp = arr[outer];        inner = outer;        while(inner > 0 && (arr[inner - 1] >= temp)){            arr[inner] = arr[inner - 1];            --inner;        }        arr[inner] = temp;    }    return arr; }

5.三种排序算法速度的比较

首先我们实现一个生成随机数组的函数:

function createArr(n){    let arr = [];    if(typeof n !== 'number'){        return;    }    if(n === 0){        return arr;    }    for(let i = 0; i < n ; i++){        arr[i] = Math.floor(Math.random() * (n + 1));    }    return arr;}

我们通过获取当前的时间戳和运行算法后时间戳进行对比来比较,主要比较数组的大小为100, 1000, 10000时来观察三种算法。

//数组为100的情况let arr = createArr(100);let start = Date.now();bubbleSort(arr);let stop = Date.now();cosnole.log(`冒泡排序用时${stop - start}`);    start = Date.now();selectionSort(arr);    stop = Date.now();cosnole.log(`选择排序用时${stop - start}`);        start = Date.now();insertionSort(arr);    stop = Date.now();cosnole.log(`插入排序用时${stop - start}`);

最后得出的结果为图片描述

说明数组大小为100时,三种排序算法速度之间没有什么太大的差别。

我把数组扩大为1000得到的结果如下:
图片描述

现在我们可以看到选择排序和插入排序比冒泡排序都快了很多。

接着我把数据增大为10000,得到的结果为:
图片描述

现在我们可以很明显的看出三种排序算法的速度谁快谁慢了,特别是我们处理比较大的数据时,对算法的选择影响到程序的性能。

转载地址:http://nwrgl.baihongyu.com/

你可能感兴趣的文章
python之路-09-文件操作
查看>>
Linux常用命令大全
查看>>
链表API
查看>>
table中绝对定位元素相对td定位失效解决方案
查看>>
打印和显示特殊需求
查看>>
python实现二分查找算法
查看>>
NYOJ747
查看>>
结构体之间的转换
查看>>
Oracle中逻辑结构图解
查看>>
java08双重循环打印图形
查看>>
面向对象03
查看>>
融资融券委托业务
查看>>
CSS实现太极图(3个div实现)
查看>>
windows环境中JDK环境变量配置
查看>>
HDU2629 Identity Card【MAP+水题】
查看>>
Project Euler Problem 11: Largest product in a grid
查看>>
转:Awesome - Image Classification
查看>>
requests模块使用代理
查看>>
jmeter关联技术
查看>>
js_初识js_js基本语法和数据类型
查看>>