JS 排序算法
冒泡排序:
核心思想:从第一个开始遍历数组,遍历完成后,让最小的值放在第一位;然后从第二个开始遍历数组,遍历完成后将最小值放在第二位;以此类推,所有位的数组遍历完成后就排序完成。
var arr = [3, 12, 53, 32, 26, 7, 1];
var len = arr.length;
for (var i = 0; i < len; i++) {
for (var j = i+1; j < len; j++) {
if (arr[i] > arr[j]) {
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
插值法排序:
核心思想:创建一个新数组,将原数组的元素一个个放到新数组中,每次放入的时候和已放入新数组的元素进行遍历比较,遇到比他大的就放那个元素前面,没遇到比他大的就放在最后。新数组即为排序后的数组。
var arr = [12, 3, 56, 2, 32, 9];
var arr2 = [];
arr2[0] = arr[0];
var len = arr.length;
var flag = 0; // 用于记录是否遇到比他大的数
for (var i = 1; i < len; i++) {
var len2 = arr2.length;
flag = 0; // 每次遍历的时候先重置标志
for (var j = 0; j < len2; j++) {
// 当遇到比他大的数,则插入到那个数前面,并将标志记为1
if (arr[i] < arr2[j]) {
arr2.splice(j, 0, arr[i]);
flag = 1;
break;
}
}
// 如果标志为0,说明没遇到比他大的,则放在最后
if (flag === 0) {
arr2.push(arr[i]);
}
}
二分法排序:
核心思想:将数组中的每个元素取出,往新数组中插入,与插入排序不同之处在于:插入排序是一个个的遍历,如果数据量较大,影响效率;二分法则不用一个个遍历,而是在插入的时候与新数组中的中间点进行比较,如果比中间点大,则又和后半截的中间点进行比较,直到找到合适的位置插入。
var arr = [43, 12, 5, 64, 23, 95, 6, 34, 72, 60];
var arr2 = [];
arr2[0] = arr[0];
var len = arr.length;
var left = 0; // 左边界
var right = 0; // 右边界
var middle = 0; // 中间点
for (var i = 1; i < len; i++) {
left = 0;
len2 = arr2.length;
right = len2;
// 这里可以使用 while(true),这样写是为了安全起见
for (var j = 0; j < len2; j++) {
middle = Math.floor((left + right) / 2);
// 判断中间点的数与插入的数的大小,移动 left 或 right
if (arr2[middle] < arr[i]) {
left = middle + 1;
} else {
right = middle;
}
// 当 left 等于 right 的时候,则找到插入的点
if (left === right) {
arr[2].splice(left, 0, arr[i]);
break;
}
}
}
快速排序:
采用了二分法排序的思想,使用递归的方式进行排序。
function quickSort(arr){
if(arr.length<=1){ //数组长度小于等于1,则不用排序,返回结果
return arr;
}
var num=Math.floor(arr.length/2); //找到基准点
var numValue=arr.splice(num,1); //取出基准点
var left=[];
var right=[];
for(var i=0;i<arr.length;i++){
if(arr[i]<numValue){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quickSort(left).concat([numValue],quickSort(right)); //对左边进行递归排序的结果+基准点+对右边进行递归排序的结果,就是排序完成的结果,返回
}
JS 排序算法的更多相关文章
- 总结下js排序算法和乱序算法
其实本人最怕的就是算法,大学算法课就感觉老师在讲天书,而且对于前端来说,算法在实际的应用中实在是很有限.毕竟算法要依靠大量的数据为基础才能发挥出算法的效率,就浏览器那性能,......是吧,退一万步说 ...
- 排序图解:js排序算法实现
之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...
- js排序算法汇总
JS家的排序算法 十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...
- 常用的 JS 排序算法整理
关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...
- 自己写的JS排序算法
这学期刚刚学完数据结构,之前就自己写了一点东西,现在整理一下. <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- js排序算法总结—冒泡,快速,选择,插入,希尔,归并
相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...
- js排序算法总结——冒泡,快速,选择,插入,希尔,归并
相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...
- 结构-行为-样式-Js排序算法之 直接插入排序
最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n&g ...
- js排序算法总结
快速排序 大致分三步: 1.找基准(一般是以中间项为基准) 2.遍历数组,小于基准的放在left,大于基准的放在right 3.递归 快速排序的平均时间复杂度是O(nlogn),最差情况是O(n²). ...
- JS排序算法
1.冒泡排序 冒泡算法是比较相邻的两项,如果前者比后者大,就交换他们. 假设一共有n项,那么一共需要n-1趟,第一趟需要交换n-1次,但是第一趟结束后,最后一项基本确定就是最大项了,所以第二次需要交换 ...
随机推荐
- Android 圆形ProgressBar风格设置
Android系统自带的ProgressBar风格不是很好,如果想自己设置风格的话,一般有几种方法.首先介绍一下第一种方法通过动画实现.在res的anim下创建动画资源loading.xml: < ...
- 介绍NSURLSession网络请求套件
昨天翻译了一篇<NSURLSession的使用>的文章,地址:http://www.cnblogs.com/JackieHoo/p/4995733.html,原文是来自苹果官方介绍NSUR ...
- c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...
- DP重新学
白书上的DP讲义:一 二 DAG上的dp 不要好高骛远去学这种高端东西,学了也写不对,剩下的几天把基本的dp和搜索搞下,就圆满了.不要再学新算法了,去九度把现有的算法写个痛. 学了数位DP和记忆搜索, ...
- list.clear()和list=null的区别
以前并没有注意到list.clear()和list=null的区别,其实,区别在于 clear()方法是将list清空,但是对象的引用还在,只不过是一个表现为空引用 list=null是将list对象 ...
- Xtreme Toolkit Pro 免费下载地址
Xtreme Toolkit Pro 是针对Windows程序员的一套先进的用户界面套包,强大的功能可使您的应用程序具有专业的.现代感的外观. Xtreme Toolkit Pro 由8个专业级的构件 ...
- 一维条形码攻击技术(Badbarcode)
0x00 前言 在日常生活中,条形码随处可见,特别在超市,便利店,物流业,但你们扫的条形码真的安全吗?之前TK教主 在PacSec介绍的条形码攻击和twitter上的demo视频太炫酷,所以就自己买了 ...
- VS2010编译Qt5.4.0静态库
http://www.kavenblog.com/?p=375 1.Qt的跨平台十分优秀,但是在Windows上是还是会有许多问题,其中之一就是动态链接库的问题,Qt程序的发布必须带一个体积不小的DL ...
- Android如何分析和研究Monkey Log文件
Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处理log文件 . 什么时候会有Log文件的产生 ...
- iOS开发:集成支付宝(遇见的坑和便捷撸代码)
开发iOS最重要的就是支付了,天朝之内最常用的就是支付宝了,下面就以自己的经历说明如何集成支付宝+遇见的坑. 首先,集成支付宝最好别使用Cocoapods,很多人都说使用起来很方便,可是我每次只要使用 ...