js算法之最常用的排序
引入
大学学习计算机语言的那几年,从c语言,到c++,再到数据结构JAVA..让我印象最深刻的还是最开始老师讲冒泡算法的时候,直到现在大四快毕业了我才渐渐通窍了。刚学前端的时候以为前端就是做出好看很炫的页面就行了,后来才渐渐懂得前端不只是页面仔。一次美团面试,面试官说他们要的不仅是前端,他们要的是“工程师”,从面试开始到结束问都是算法,顿时把我给打击了。二叉树、基本算法还有时间复杂度都是很重要的东西,不仅体现了一个前端的学习深度,还体现了一名计算机学生的专业水平。所以,为了查缺补漏,我决定开始研究一下程序猿最爱提的算法,今天聊聊最常用的排序算法。鱿鱼看过很多资料觉得都太专业化了,根本看不懂,所以以下我都尽量用能让自己(别人)看懂的介绍来描述啦~
常用排序算法
冒泡排序(Bubble sort)
大白话介绍:比较相邻的两个数,如果后面的比前面的小,把小的放在前面。
时间复杂度: O(n2)
动画演示:冒泡排序
实际代码:
方法一:
function bubbleSort(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-1;j++){
if(arr[j+1]<arr[j]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
//对比arr中的第j+1项和第j项,如果第j+1项小于第j项,就把第j+1项和第j项调换位置。如果没达到最终的顺序(从小到大),就继续找,继续换,直到达到最终效果
但是上面的方法并不完美,如果数组已经是有序了,就没必要再比较了,所以下面有一种优化冒泡排序算法:
优化冒泡排序算法
方法二(优化算法):
function bubbleSort(arr){
var flag = false; // 定义一个变量为false,未交换位置
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-1;j++){
if(arr[j+1]<arr[j]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
flag = true; //true,已交换位置
}
}
if(flag){
flag = false; //如果交换了位置,将flag重新设为false
}else{
break; //如果未交换,则跳出循环
}
}
return arr;
} 或者写成这样~
function bubbleSort(arr){
var flag;
for(var i=0;i<arr.length-1;i++){
flag =false;
for(var j=0;j<arr.length-1;j++){
if(arr[j+1]<arr[j]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
flag = true;
}
}
if(!flag){
return arr;
}
}
return arr;
}
选择排序(selection Sort)
大白话介绍:在乱序的数组中选择最小的值,然后和每次循环后的数组的第一位进行交换
时间复杂度:O(n2)
动画演示:选择排序
实际代码:
var arr=[5,3,2,4,1,0];
function findMin(arr,first){
var minindex = first; //定义最小下标
var minNum = arr[first]; //定义数组中的最小值
for(var i=first+1;i<arr.length;i++){ //循环找到最小值和最小下标
if(arr[i]<minNum){
minNum = arr[i];
minindex = i;
}
}
return minindex;//返回最小值下标 一共查找了六次,最小值下标分别为 :5,4,2,4,4,5
} function selectionSort(arr){
for(var i=0;i<arr.length;i++){
var min =var temp = arr[min];
arr[min] = arr[i]; //eg.第一次循环 :将最小值5和arr[0]进行交换
arr[i] = temp; // 剩下几次同第一次
}
return arr;
} document.write(selectionSort(arr)); //0,1,2,3,4,5,
排序过程:(自己画的一个粗糙的框框表嫌弃)
归并排序(mergeSort)
大白话介绍: 把一个数组分为两个数组,左边排好序,右边排好序,然后合并到一起排序
专业性介绍: 归并排序是分治法的典型实例,指的是将两个已经排序的序列合并成一个序列的操作
时间复杂度: O(nlogn)
动画演示:归并排序
实际代码:
var arr=[-11,17,12,19,0,-222];
function mergeSort(arr,s,e){
if(s>e){ //起始位置大于终点位置,返回空数组
return [];
}else if(s==e){
return [arr[s]]; //起始位置等于终点位置,说明数组里只有一个数字,返回只含一个数字的数组
} var mIndex = Math.floor((s+e)/2); //中间位置的Index
var arrL = mergeSort(arr,s,mIndex); //将左边的数组排序
var arrR = mergeSort(arr,mIndex+1,e); //将右边的数组排序 var resultArr = []; //结果数组
while(arrL.length>0 || arrR.length>0){ //当左右两个数组都不为空时
if(arrL[0]<arrR[0]){
resultArr.push(arrL.shift());
}else{
resultArr.push(arrR.shift());
} if(arrL.length==0){ //当左边的数组为空时
resultArr = resultArr.concat(arrR);
break;
}else if(arrR.length==0){
resultArr = resultArr.concat(arrL);
break;
}
}
return resultArr;
} document.write(mergeSort(arr,0,arr.length-1));
排序过程:
快速排序(quickSort)
大白话介绍:引用阮一峰老师的一句话,感觉是极好理解的~(我的目标也是成为像阮一峰老师这样的)
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
实际代码:
var arr=[77,-33,22,32,0,2,11];
function quickSort(arr){
if(arr.length<=1){ //如果数组中只有一位数,返回数组
return arr;
}
var mNumIndex = Math.floor(arr.length/2); //取基准值的下标
var mNum = arr.splice([mNumIndex],1)[0]; //取基准值
var left = []; //左边数组
var right = []; //右边数组 for(var i=0;i<arr.length;i++){
if(arr[i]<mNum){ //如果数组小于基准值,放在左边数组
left.push(arr[i]);
}else{ ///否则
right.push(arr[i]);
}
}
return quickSort(left).concat([mNum],quickSort(right)); //返回左边数组+基准值+右边数组
} document.write(quickSort(arr));
排序过程:
以上就是一些常见的排序了,但是还有很多常见的排序没有提到~~ 后期还会写一个常用排序二~敬请期待噢 ~希望我学到的东西也能帮助到大家~有说错的地方欢迎批评指正~
学习资料:
http://bubkoo.com/2014/01/15/sort-algorithm/merge-sort/
http://www.cnblogs.com/binking338/p/3440296.html
http://www.webhek.com/misc/comparison-sort
http://www.cnblogs.com/CareySon/archive/2011/10/28/2227703.html
http://bubkoo.com/2014/01/15/sort-algorithm/merge-sort/
http://www.cnblogs.com/wteam-xq/p/4752610.html
http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html
js算法之最常用的排序的更多相关文章
- js算法初窥01(排序算法01-冒泡、选择、插入)
排序,我想大家一定经历过或者正在经历着.或许你不懂算法,对排序算法一无所知,但是你一定用过一些第三方库的api来一键排序,那么,在你享受便捷的同时,你是否想过它的底层是如何实现的?这样的算法实现方式是 ...
- js算法初窥02(排序算法02-归并、快速以及堆排序)
上一篇,我们讲述了一些简单的排序算法,其实说到底,在前端的职业生涯中,不涉及node.不涉及后台的情况下,我目前还真的没想到有哪些地方可以用到这些数据结构和算法,但是我在前面的文章也说过了.或许你用不 ...
- js算法初窥05(算法模式02-动态规划与贪心算法)
在前面的文章中(js算法初窥02(排序算法02-归并.快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的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)冒 ...
随机推荐
- ArcGIS API中FindTask中文搜索无效,服务器编码问题URIEncoding="utf-8"
问题来源:字符编码问题导致ArcMap中字符乱码或显示不正常,因而在F:\Program Files\ArcGIS\Server\framework\runtime\tomcat\conf中serve ...
- u3d avatar部件的理解
u3d中带动画的fbx文件导入的时候,就会显示一个avatar组件,这个到底干嘛的一直没能很好的理解,翻看网上的介绍,基本都是告诉你,设置humanoid类型动画时,拖拉过去之类,但是这玩意到底存储了 ...
- [转]Navicat for MySQL快捷键
Navicat for MySQL快捷键 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+ ...
- hdu 5719(Arrange)(冷静分析)
A数组显示从0到i的最小值B数组显示从0到i的最大值由此可得:A数组是单调不增的(怎么也会不使得最小值变大)B数组是单调不减的.设premin和premax为i位以前的最小值和最大值.可以得出以下几点 ...
- ecshop数据表说明
ecshop数据表说明 数据库结构说明,以及自己在后台备份不需要备份的表(红色字体是不需要备份的表)备份文件在FTP或者服务器上网站根目录下data\sqldata下 数据库采用mysql,共78张表 ...
- mysql where 1=1和 1=0 的作用
本文来自网络 where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句. 一.不用where 1=1 在多条件查询中的困扰 举个例子,如果您做查询页面,并 ...
- mysql 数值函数
可使用常见的算术操作符.注意就 -. +和 *而言, 若两个参数均为正数,则其计算结果的精确度为 BIGINT (64比特),若其中一个参数为无符号整数, 而其它参数也是整数, 则结果为无符号整数.请 ...
- 深入理解Ember-Data特性(上)
写在前面 最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客.常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要 ...
- activeMq笔记
安装 下载地址:http://activemq.apache.org/download.html 安装教程: http://gerrard-ok.iteye.com/blog/1766203 解压缩: ...
- Windows Phone App的dump 文件分析
前言 我们在发布了自己的App以后,Windows Phone的Error Report机制会帮助我们收集程序的崩溃信息并发送到微软的服务器上,这可以辅助开发者提高App的稳定性. 那么如何利用这些d ...