1、基本排序算法

1.1、冒泡排序

它是最慢的排序算法之一。

1、不断比较相邻的两个元素,如果前一个比后一个大,则交换位置。

2、当比较完第一轮的时候最后一个元素应该是最大的一个。

3、按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以第二轮的时候最后一个元素不用比较,此后依次类推。

                      冒泡排序动图演示:

function bubbleSort(arr){
for(var i=0; i<arr.length-1; i++ ){
for(var j=0; j<arr.length-1-i ;j++ ){
if(arr[j] > arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}

另一种写法可能更好理解:每一次比较后都拿最小的那个元素放到前面

for (let i = 0; i < ns.length - 1; i++) {
for (let j = i + 1; j < ns.length; j++) {
let temp;
if (ns[i] > ns[j]) {
temp = ns[i];
ns[i] = ns[j];
ns[j] = temp;
}
}
}

1.2、选择排序

从数组的开头开始,将第一个元素和其他元素进行比较,比较完所有元素后,将最小的元素与第一个元素交换,然后算法会从第二个元素继续,依次类推。当进行到数组的倒数第二个位置时,所有的数据便完成了排序。

                      选择排序动图演示:

function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var 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;
}

1.3、插入排序

从第二个元素开始循环,当前面的元素比选中的元素大时将前面的元素向右移动,直至比较到第1个元素(即索引为0)或者前面的元素不再比选中的大,此时将选中的元素赋值给比它小的元素之后的位置。

                      插入排序动图演示:

function insertionSort(arr) {
var len = arr.length;
var preIndex, current;
for (var 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;
}

以上的三种基本排序算法中,选择排序和插入排序要比冒泡排序快,插入排序是这三种算法中最快的

2、高级排序算法

高级排序算法被认为是处理大型数据集的最高效排序算法,它们处理的数据集可以达到上百万个元素。

2.1、希尔排序

这在插入排序的基础上做了很大的改善。它会首先比较距离较远的元素,而非相邻的元素。比较的元素之间的距离会不断减小,直至比较的是相邻元素,此时就是一个直接的插入排序。在开始做最后一次处理时,大部分元素都已经在正确的位置,算法就不必对很多元素进行交换,这就是希尔排序比插入排序更高效的地方。

比如:数组为 [49,38,65,97,26,13,27,49,55,4],当间隔为5时,将分组为五组数据(49,13)、(38,27)、(65,49)、(97,55)、(26,4),分别对五组数据进行直接的插入排序,然后此时的数组会变为 [13,27,49,55,4,49,38,65,97,26],依次类推直至间隔为1

通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔。下面的算法时是动态定义间隔序列。

function shellSort(arr) {
var len = arr.length, current, gap = 1;
while (gap < len / 3) { //动态定义间隔序列
gap = gap * 3 + 1;
}
for (gap; gap > 0; gap = Math.floor(gap / 3)) { //间隔在不断改变,直至为 1
for (var i = gap; i < len; i++) { //从数组索引为间隔大小的位置开始
current= arr[i]; //相当于直接插入排序的选中元素
for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) { //间隔序列所间隔开的元素进行直接插入排序
arr[j + gap] = arr[j];
}
arr[j + gap] = current; //将选中的元素赋值给比它小的元素之后的位置
}
}
return arr;
}

2.2、归并排序

归并排序的实现有两种方法:1、自上而下(自顶向下)的递归  。2、自下而上(自底向上)的迭代

将数据集分解为多组分别只有一个元素的数组,然后通过创建一组左右子数组将它们两两有序地合并起来,直到最后合并剩下的两个大的数组组成有序的完整数组。

                        归并排序动图演示:

function mergeSort(arr) {
var len = arr.length;
if (len < 2) {
return arr;
}
var middle = Math.floor(len / 2),
left = arr.slice(0, middle),
right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
} function merge(left, right) {
var 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;
}

2.3、快速排序

是处理大数据最快的排序算法之一,快速排序算法非常适用于大型数据集合;在处理小数据集时性能反而会下降。

(1) 选择一个基准元素,将列表分隔成两个子序列,将所有小于基准值的元素放在基准值的前面,所有大于基准值的元素放在基准值的后面; (2) 分别对较小元素的子序列和较大元素的子序列重复步骤 1

                        快速排序动图演示:

function qSort(arr) {
if (arr.length == 0) {
return [];
}
var left = [];
var right = [];
var pivot = arr[0];
for (var i = 1; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return qSort(left).concat(pivot, qSort(right)); //小的元素都放在了基准值的左边,大的都放在了右边。小的和大的分别进行了递归,结果也是如此,所以完成了排序。
}

3、时间、空间复杂度

JS中算法之排序算法的更多相关文章

  1. 今天给大家分享一下js中常用的基础算法

    今天给大家分享一下js中常用的基础算法,废话不多说,直接上代码: 1.两个数字调换顺序 ,b= function fun(a,b){ b = b - a ;// a = 2 ; b = 2 a = a ...

  2. 使用 js 实现十大排序算法: 堆排序

    使用 js 实现十大排序算法: 堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列: 小顶堆:每个 ...

  3. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  4. js 常用的比较排序算法总结

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚, ...

  5. Java基础语法(8)-数组中的常见排序算法

    title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...

  6. 使用 js 实现十大排序算法: 快速排序

    使用 js 实现十大排序算法: 快速排序 QuickSort 快速排序 /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @c ...

  7. 使用 js 实现十大排序算法: 桶排序

    使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. 使用 js 实现十大排序算法: 计数排序

    使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  9. 使用 js 实现十大排序算法: 基数排序

    使用 js 实现十大排序算法: 基数排序 基数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

随机推荐

  1. C#-概念-类:类

    ylbtech-C#-概念-类:类 类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础.类是一种用户定义类型,也称类类型.每个类包含 ...

  2. 【Unity 系统知识】 各种路径

    一.Assets下的Resources(Unity系统文件夹) :路径 Application.dataPath/Resources 可以使用Resources.Load("文件名字,注:不 ...

  3. js 函数 写法

    // function ckeckName(){}; // function checkUser(){}; // function checkPassWorld(){}; // var checkNa ...

  4. nmon内存分析

    可参考: MemTotal:显示当前服务器物理内存大小,本服务器有8063180 KB≍7874 MB左右. MemFree:显示当前服务器的空闲内存大小,本服务器有5052336 KB≍4934 M ...

  5. Oracle-常见的错误

    1.见下面的例子 create or replace procedure p_qr_stu_cid(s_id in number, c_id out number) as begin select t ...

  6. CentOS安装ruby, Haskall,io语言

    安装ruby yum install ruby irb rdoc 安装Haskall yum install ghc 安装io语言 安装io语言,需要先安装cmake不过不要使用yum来进行安装,yu ...

  7. pandas分组聚合案例

    美国2012年总统候选人政治献金数据分析 导入包 import numpy as np import pandas as pd from pandas import Series,DataFrame ...

  8. shuoj 1 + 2 = 3? (二分+数位dp)

    题目传送门 1 + 2 = 3? 发布时间: 2018年4月15日 22:46   最后更新: 2018年4月15日 23:25   时间限制: 1000ms   内存限制: 128M 描述 埃森哲是 ...

  9. 解决java.net.BindException: Address already in use(Bind failed)端口占用问题

    问题描述: 解决办法: sudo lsof -i:20101ps -ef|grep 9905kill -9 9905ps -ef|grep 9905 ------------------------- ...

  10. XSS——跨站脚本攻击

    跨站点脚本攻击:通过对网页注入恶意脚本,成功地被浏览器执行,来达到攻击的目的. 一.XSS攻击类型与原理1. 反射型XSS攻击非持久性攻击,黑客使用社交性的交互技巧诱导用户点击访问目标服务器的链接,但 ...