列表

  1. 冒泡排序

  2. 选择排序

  3. 插入排序

  4. 快速排序

  5. 希尔排序

  6. 归并排序

冒泡排序

// 输入:[5, 6, 3, 4, 8, 0, 1, 4, 7]
// 输出:[0, 1, 3, 4, 4, 5, 6, 7, 8]
外层1:
内层1:3 6 5 8 0 1 4 7
内层2:0 6 5 8 3 1 4 7
外层2:
内层1:0 5 6 8 3 1 4 7
内层2:0 3 6 8 5 1 4 7
内层3:0 1 6 8 5 3 4 7 // 每一次外层循环是为了找到当前最小的值
// 外层循环当前值与内层循环的值进行比较 function bubbleSort(arr) {
for(var i = 0, l = arr.length;i < l - 1;i++) {
for(var j = i + 1;j < l;j++) {
if(arr[i] > arr[j]) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}

选择排序


// 每一次从待排的数据元素中选出最小或者最大的一个元素
// 存放在系列的起始位置, 直到全部待排的数据排完。 function selectSort(arr) {
for(var i = 0;i < arr.length - 1;i++) {
// 无序区的最小数据数组下标
var minIndex = i;
for(var j = i + 1;j < arr.length;j++) {
// 在无序区查找最小数据并保存其下标
if(arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 将最小的项移到左边
if(minIndex != i) {
var temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
return arr;
}

冒泡排序是直接交换, 而选择排序是保存下标,最后交换

插入排序


// 取第一个数字是排序好了的
// 可以理解为左边是排序好的数组
// 右边是待排序的数组 function insertSort(arr) {
for(var i = 1;i < arr.length;i++) {
if(arr[i - 1] > arr[i]) {
// 记录要被插的数字
var guard = arr[i];
// 记录有序数组的最后一个数字的下标
var j = i - 1; // 开始判断并且右移动
while(j >= 0 && arr[j] > guard) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = guard;
}
}
return arr;
}

快速排序

// 1. 在数组中,选一个元素作为基准
// 2. 所有小于基准的元素,都移到基准的左边;所有大于基准的元素,都移到基准的右边。
// 3. 对基准左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
function quickSort(arr) {
if(arr.length <= 1) {
return arr;
}
var pivotIndex = Math.floor(arr.length / 2);
// 找到基准元素,并将其从数组中分离出来
var pivot = arr.splice(pivotIndex, 1)[0];
var leftArr = [];
var rightArr = [];
for(var i = 0;i < arr.length;i++) {
if(arr[i] > pivot) {
rightArr.push(arr[i]);
} else {
leftArr.push(arr[i]);
}
}
return quickSort(leftArr).concat([pivot], quickSort(rightArr));
}

希尔排序


// 希尔排序也叫增量递减排序
// 核心思想就是分组
// 然后在组里进行常规的插入排序 var arr = [10, 6, 3, 4, 8, 0, 1, 4, 7];
function shellSort(arr) { // 取增量
var gap = Math.floor(arr.length / 2); // 只要增量大于1,就可以一直算
while(gap > 0) { // 从第一个子列的最后一个数开始计算
for(var i = gap;i < arr.length;i++) { // 存储当前子列的最后一个数
var temp = arr[i]; // 对子列进行普通的插入排序
// i是当前子列的最后一个数的坐标
// j等于i,j从当前子列的最后一个数往前计算
// 这里该怎么理解呢, 我来举个例子
// 如果数组排序到了: 8, 0, 9, 4, 7, 6, 3, 4, 10
// 此时j为6, gap为2
// 这样就好理解了 for(var j = i;j >= gap && arr[j - gap] > temp; j -= gap) { // 将下标j对应的值改变为大的那个
arr[j] = arr[j - gap];
} // 如果中间出现了交换, j的值要变化
// 那么相当于交换
// 如果j的值没有变化,那么a[j]的值本身没有变化
arr[j] = temp;
} gap = Math.floor(gap / 2);
}
return arr;
}

归并排序

// 归并排序的基本操作是合并两个已经排好序的数组

// 增加额外的空间,用于合并两个已经排序好的数组
function merge(left, right) {
var result = [];
while(left.length > 0 && right.length > 0) {
if(left[0] < right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
return result.concat(left, right);
} // 递归
function mergeSort(arr) {
if(arr.length == 1) {
return arr;
}
var middle = Math.floor(arr.length / 2);
var left = arr.slice(0, middle);
var right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}

JavaScript实现常见排序算法的更多相关文章

  1. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  2. JS常见排序算法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  4. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  5. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  6. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  7. python——常见排序算法解析

    算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...

  8. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  9. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

随机推荐

  1. 程序员的一生时间90%是用在编程上,而剩余的10%是活在世界上。刚进CSDN的博客看到这么句话

    程序员的一生时间90%是用在编程上,而剩余的10%是活在世界上. 而自己呢?是个程序员呢还是个业余玩家!

  2. bzoj4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    4554: [Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能 ...

  3. Windows下composer的下载与配置

    composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. 下面记录一 ...

  4. 在CentOS 7中安装Redis 3.2.8

    文章环境: CentOS 7 biuld 1611最小化安装@VMware Redis 3.2.8 安装步骤: #安装gcc yum -y install gcc #下载redis curl -O h ...

  5. Qt中纯C++项目发布为dll的方法(超详细步骤)

    众所周知,我们可以将C++项目中的类以及某些方法导出,形成 .dll 文件,以供其他程序使用,下面将说明Qt环境下的使用方法. 首先创建共享库,步骤如下: 下一步会出现类对话框等等,不用管它,直接点击 ...

  6. 最近发现的.net core中的一些bugs

    1.使用.net core的过程中发现TypeInfo.GetCustomAttributes()只能写在主线程中,否则如果该自定义特性存在于nuget中就会报错,貌似nuget中的dll仅在主线程使 ...

  7. 脚本之家 前端jQuery js 学习 网站

    http://www.jb51.net/books/ http:// www.3wschool.com/

  8. Unity3D换装系统

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6505561.html 一.换装原理 游戏角色换装分为以下几步: 1.替换蒙皮网格 2.刷新骨骼 3.替换材质 上 ...

  9. 北邮OJ

    90. 字符串转换 时间限制 1000 ms 内存限制 65536 KB 题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而" ...

  10. SQL Server-聚焦NOLOCK、UPDLOCK、HOLDLOCK、READPAST你弄懂多少?(三十四)

    前言 时间流逝比较快,博主也在快马加鞭学习SQL Server,下班回来再晚也不忘记更新下博客,时间挤挤总会有的,现在的努力求的是未来所谓的安稳,每学一门为的是深度而不是广度,求的是知识自成体系而不是 ...