JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍
由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序、快速排序、直接插入排序、希尔排序、直接选择排序
▓▓▓▓▓▓ 交换排序
交换排序是一类在排序过程中借助于交换操作来完成排序的方法,基本思想是两两比较排序记录的关键字,如果发现两个关键字逆序,则将两个记录位置互换,重复此过程,直到该排序列中所有关键字都有序为止,接下来介绍交换排序中常见的冒泡排序和快速排序
▓▓▓▓▓▓ 冒泡排序
冒泡排序的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名
冒泡排序算法的运作如下:(从后往前)
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的时间复杂度是 O(n^2)
代码:
// 冒泡排序
function bubbleSort(arr){ for(var i=0;i<arr.length;i++){
for(var j=0;j<arr.length-i-1;j++){
if(arr[j] > arr[j+1]){
var arrMax = arr[j+1];
arr[j+1] = arr[j];
arr[j] = arrMax;
}
}
} return arr;
}
▓▓▓▓▓▓ 快速排序
// 快速排序
function quickSort(arr){
// 结束递归条件
if(arr.length <= 1){
return arr;
} var left = [];
var right = [];
var key = arr[0]; // 分组
for(var i=1;i<arr.length;i++){
if(arr[i] < key){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
} // 递归分组
return quickSort(left).concat(key,quickSort(right));
}
▓▓▓▓▓▓ 插入排序
插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排序的序列中的适当位置,直到全部记录插入完成为止,接下来介绍两种常用的插入排序方法:直接插入排序和希尔排序
▓▓▓▓▓▓ 直接插入排序

// 直接插入排序
function insertSort(arr){
// 默认第一个元素是有序的
for(var i=1;i<arr.length;i++){ if(arr[i] < arr[i-1]){
var guard = arr[i];
var j = i - 1;
// 将有序数组扩大一位
arr[i] = arr[j]; //遍历有序组,找到自己的位置
while(j >= 0 && guard < arr[j]){
arr[j+1] = arr[j];
j--;
} // 插入检查的元素
arr[j+1] = guard;
}
}
return arr;
}
▓▓▓▓▓▓ 希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出 而得名。
// 希尔排序
function shellSort(arr){
var len = arr.length;
var stepLen = 1;
// 确定首次遍历的步长
while(stepLen < len/3){
stepLen = 3*stepLen + 1;
}
// 开始遍历
while(stepLen >= 1){
for(var i=stepLen;i<len;i++){
for(var j=i;j>=stepLen && arr[j] < arr[j-stepLen];j-=stepLen){
swap(arr,j,j-stepLen);
}
}
stepLen = (stepLen - 1)/3;
} return arr;
} function swap(arr,i,j){
var temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
▓▓▓▓▓▓ 选择排序
选择排序的基本思想是:每一趟排序在n-i+1个带排序记录中选出关键字最小的记录,作为有序序列的第i个记录,直到全部记录排序完毕。常用的排序方法有直接选择排序和堆排序(由于js不能很好的体现堆排序的特点就不写了)
▓▓▓▓▓▓ 直接选择排序
基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列
直接选择排序的时间复杂度:O(n^2)
代码:
// 直接选择排序
function straightSelectSort(arr){
// 默认第一个元素是最小的
var min;
var k;
var lArr = [];
for(var i=0;i<arr.length-1;i++){
min = arr[i];
k = i;
for(var j=i+1;j<arr.length;j++){
if(arr[j] < min){
min = arr[j];
k = j;
}
}
if(k != i){
arr[k] = arr[i];
arr[i] = min;
}
}
return arr;
}
JavaScript实现常用的排序算法的更多相关文章
- 常用Java排序算法
常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...
- java SE 常用的排序算法
java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...
- C#中常用的排序算法的时间复杂度和空间复杂度
常用的排序算法的时间复杂度和空间复杂度 常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...
- 数据结构中常用的排序算法 && 时间复杂度 && 空间复杂度
第一部分:数据结构中常用的排序算法 数据结构中的排序算法一般包括冒泡排序.选择排序.插入排序.归并排序和 快速排序, 当然还有很多其他的排序方式,这里主要介绍这五种排序方式. 排序是数据结构中的主要内 ...
- 常用的排序算法介绍和在JAVA的实现(二)
一.写随笔的原因:本文接上次的常用的排序算法介绍和在JAVA的实现(一) 二.具体的内容: 3.交换排序 交换排序:通过交换元素之间的位置来实现排序. 交换排序又可细分为:冒泡排序,快速排序 (1)冒 ...
- 记一下JavaScript的几种排序算法
零.写在最前 排序的方法有很多种,这篇文章只是记录我熟悉的算法: 我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看! 附上SortAnimate网站链接:http ...
- 排序总结---常用的排序算法总结,java和js实现
这篇博客对几种常见的排序算法进行归纳总结,在接下来的博客中会依次给出每个排序算法的例子 [由于博客上面进行编辑不太方便,图表都是在电脑上编辑好,上传的图片] 1.排序的分类 2.几种内部排序方法的比较 ...
- JavaScript十大经典排序算法
排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ...
- 常用的排序算法介绍和在JAVA的实现(一)
一.写随笔的原因:排序比较常用,借此文介绍下排序常用的算法及实现,借此来MARK一下,方便以后的复习.(本人总是忘得比较快) 二.具体的内容: 1.插入排序 插入排序:在前面已经排好序的序列中找到合适 ...
随机推荐
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 学习AOP之认识一下Spring AOP
心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- AFNetworking 3.0 源码解读 总结(干货)(上)
养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...
- js数组学习整理
原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- GOF23设计模式归类
创建型模式:-单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式结构型模式:-适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式行为型模式:-模板方法模式.命令模式.迭代器模式 ...
- 听H3絮叨:何以让天下没有难用的流程
最近朋友圈.网站新闻铺天盖地是"让天下没有难用的流程",有人就要问了,H3 BPM何德何能,为BPM站台,让天下没有难用的流程? 这是一个关于"办公室空想"的故 ...