用javascript实现简单排序算法
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!
本文为楼主自己的学习记录文章,若有不当之处请斧正。
本文主要记录排序算法
【冒泡排序】
感觉这个是最简单的排序算法了。直接引用维基百科里的解释:
冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
原理相当容易理解:
实现代码如下:
var array = [],maxNum = 100;
        for(var i=0;i<maxNum;i++){
            array.push(parseInt(Math.random()*maxNum));
        }
        console.log("排序前:"+array);
        bubbleSort(array);
        console.log("排序后:"+array);
        function bubbleSort(array){
            var end = array.length-1;
            while(end>0){
                for(var i=0;i<end;i++){
                    if(array[i]>array[i+1]){
                        var md = array[i+1];
                        array[i+1] = array[i];
                        array[i] = md;
                    }
                }
                end--;
            }
        }
之后就不贴结果图了,都一样,= =反正都排的出来。
【插入排序】
插入排序算法大概原理:遍历数组,取两个相邻数据a和b,a数据之前的数据为有序区,b数据之后的为无序区。如果b大于a,继续往下遍历。如果b小于a,则把b跟有序区里的值按<-方向进行比对,比b大的数据索引均加一。当遍历到小于或等于b的数据时,那个位置就是b应该呆的位置。用维基百科上的一张图,就能秒懂了

插入也挺容易理解的:
var array = [],maxNum = 100;
        for(var i=0;i<maxNum;i++){
            array.push(parseInt(Math.random()*maxNum));
        }
        console.log("排序前:"+array);
        insertSort(array);
        console.log("排序后:"+array);
        function insertSort(array){
            for(var i=0;i<array.length;i++){
                var a = i,b = i+1;
                if(array[a]>array[b]){
                    var j = b-1,ayb = array[b];
                    while(ayb<array[j]){
                        array[j+1] = array[j]
                        j--;
                    }
                    array[j+1] = ayb;
                }
            }
        }
【希尔排序】
希尔排序算法大概原理:遍历的方法跟插入排序差不多,不一样的就是希尔排序是先将数组分成多列,对每一列里的数据进行排序,然后对列数进行N/2操作,再进行逐列排序,直至列数为1时,数组即排列完毕。
var array = [],maxNum = 100;
        for(var i=0;i<maxNum;i++){
            array.push(parseInt(Math.random()*maxNum));
        }
        console.log("排序前:"+array);
        shellSort(array ,10);
        console.log("排序后:"+array);
        function shellSort(array , d){
            // var d = d;
            while(d>=1){
                sort(array , d);
                d = Math.floor(d/2)
            }
        }
        function sort(array , d){
            var h = array.length/d;
            for(var i=0;i<d;i++){
                for(var j=0;j<h;j++){
                    var a = i+j*d , b=a+d;
                    if(array[a]>array[b]){
                        var g = a,ayb = array[b];
                        while(ayb<array[g]){
                            array[g+d] = array[g]
                            g-=d;
                        }
                        array[g+d] = ayb;
                    }
                }
            }
        }
【快速排序】
这个排序算法想了比较久,脑子没那么灵活,所以研究了好一会才弄懂原理。其实说白了就是取个key作为中间值,把比key大的数据扔右边,把比key小的扔左边,循环递归。
再详细说下快速排序算法原理(我理解的):取数组的一个数据作为key,一般取第一个数据,然后进行遍历,将比key大的值扔在右边,把比key小的值扔在左边。遍历的方法:定义变量i、j,i为0,j为数组最后一个元素的索引。首先先从j到i方向开始遍历,i不动。即是<--方向,当遍历到的数据比key小且比array[i]的值小的时候,交换array[i]和array[j]的值。然后停止j向i的运动,开始i向j方向进行遍历当遍历到的数据比key小且比array[j]的值大的时候,交换array[i]和array[j]的值。然后停止i向j的运动,再开始j向i方向进行遍历,如此循环,当i==j的时候,说明array[i]的位置就是key值应该在的位置,key值在的位置左边都是比key小的值,右边都是比key大的值。 这是第一次循环,所以把key作为中点把数据分成两边,然后再对两边同时进行递归。算到最后排序的开始点与结束点相差仅为1时,整个数组的排序就已经排序好了。
代码如下:
var array = [],maxNum = 100;
        for(var i=0;i<maxNum;i++){
            array.push(parseInt(Math.random()*maxNum));
        }
        console.log("排序前:"+array);
        quickSort(array , 0 , array.length-1);
        console.log("排序后:"+array);
        function quickSort(array , start , end){
            //key是分割线
            var i=start;j = end,key = array[start];
            while(i<j){
                while(i<j){
                    if(array[j]<=key&&array[j]<array[i]){    //j->i方向的遍历,如果比key小且比array[i]小,交换数据
                        var md = array[i];
                        array[i] = array[j];
                        array[j] = md;
                        break;
                    }
                    j--;
                }
                while(i<j){
                    if(array[i]>=key&&array[i]>array[j]){    //i->j方向的遍历,如果比key大且比array[j]大,交换数据
                        var md = array[i];
                        array[i] = array[j];
                        array[j] = md;
                        break;
                    }
                    i++;
                }
            }
            if(i-start>1){            //对key左边的数据进行递归排序
                quickSort(array , start , i-1)
            }
            if(end-i>1){            //对key右边的数据进行递归排序
                quickSort(array , i+1 , end)
            }
        }
【选择排序】
原理:将序列划分为无序和有序区,寻找无序区中的最小值和无序区的首元素交换,有序区扩大一个,循环最终完成全部排序。
代码:
        var array = [],maxNum = 100;
        for(var i=0;i<maxNum;i++){
            array.push(parseInt(Math.random()*maxNum));
        }
        console.log("排序前:"+array);
        selectSort(array);
        console.log("排序后:"+array);
        function selectSort(array){
            var i = 0;    //无序区最小指针
            while(i<array.length){
                var index = 0 , min = null;  //index为当前遍历到的地址,min存放最小值
                for(var j=i;j<array.length;j++){
                    if(array[j]<min||min===null){
                        min = array[j];
                        index = j;
                    }
                }
                if(array[i]!==min){            //提高排序稳定性,如果两个元素值相同则不交换
                    var md = array[i];
                    array[i] = array[index];
                    array[index] = md;
                }
                i++;
            }
        }
再贴上一个各个算法之间的计算速度测试DEMO,快速排序果然牛逼,浏览器内置排序函数sort都没快速排序快,当数据量达到千万级的时候,两者的差距就是几十秒了。
用javascript实现简单排序算法的更多相关文章
- JavaScript中简单排序总结
		
JavaScript中简单排序总结 冒泡排序 经典排序算法, 双重for循环 在第二个for循环的时候, j < arr.len -1 -i , 这一步的优化很重要 function bullS ...
 - 简单排序算法 C++类实现
		
简单排序算法: 冒泡排序 插入排序 选择排序 .h代码: // // SortClass.h // sort and selection // // Created by wasdns on 16/1 ...
 - 简单排序算法设计(Java)
		
总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){ for(int i=0; ...
 - javascript 中合并排序算法 详解
		
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
 - JavaScript实现各种排序算法
		
前言:本文主要是用JavaScript实现数据结构中的各种排序算法,例如:插入排序.希尔排序.合并排序等. 冒泡排序 function bubbleSort(arr) { console.time(& ...
 - js的几种简单排序算法及其效率实测
		
function swap(arr,index1,index2){ var t = arr[index1]; arr[index1] = arr[index2]; arr[index2] = t; } ...
 - python实现简单排序算法
		
算法 递归两个特点: 调用自身 有穷调用 计算规模越来越小,直至最后结束 用装饰器修饰一个递归函数时会出现问题,这个问题产生的原因是递归的函数也不停的使用装饰器.解决方法是,只让装饰器调用一次即可,那 ...
 - 三种简单排序算法(java实现)
		
一.冒泡排序 算法思想:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端.重复操 作 ...
 - 几个简单排序算法的Python实现
		
一,冒泡排序 冒泡排序我就不多讲了,大体上就是比较相邻的两个数,每次把较大的数沉底.流程图大致上如下: 图是截得别人的,只是说明一下,代码没有参看别人的,写的不好,有更好的写法可以一起探讨.下面是代码 ...
 
随机推荐
- CentOS6.5(Python-2.7.12)安装Pip
			
1.安装setuptools(下载链接可从https://pypi.python.org/pypi/setuptools#code-of-conduct寻找) #Download setuptools ...
 - 烂泥:KVM快照的创建与恢复
			
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 因为要做有关KVM虚拟机的实验,所以需要虚拟机生成快照.查询相关资料,说KVM可以使用两种方法生成虚拟机的快照. 方法一.使用qemu-img snap ...
 - python strip() lstrip() rstrip() 使用方法
			
Python中的strip用于去除字符串的首尾字符串,同理,lstrip用于去除最左边的字符,rstrip用于去除最右边的字符. 这三个函数都可传入一个参数,指定要去除的首尾字符. 需要注意的是,传入 ...
 - hdu 4832 Chess(dp)
			
Chess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
 - PHP水印类
			
<?php /** * 水印类 * @author zhaoyingnan 2015/07/16 **/ include_once('extend.php'); class Watermark_ ...
 - Windows Live Writer离线编写博客
			
WLW最新版本为2012,官网下载 Windows Live Writer配置步骤 使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结 L ...
 - sublime学习
			
1:goto anything 特性 快捷键 ctrl + P @ : # 使用 2:多行游标功能 快捷键 ctrl + D ctrl + K 跳过选择 alt + F3 多选 产生 ...
 - gunplot demo
			
//author : Leon yangli0534@gmail.com #include <stdlib.h> #include <stdio.h> #include < ...
 - cri-o pod 创建源码分析
			
1. server/sandbox.go // RunPodSandbox creates and runs a pod-level sandbox func (s *Server) RunPodSa ...
 - 瓶颈生成树与最小生成树  POJ 2395 Out of Hay
			
百度百科:瓶颈生成树 瓶颈生成树 :无向图G的一颗瓶颈生成树是这样的一颗生成树,它最大的边权值在G的所有生成树中是最小的.瓶颈生成树的值为T中最大权值边的权. 无向图的最小生成树一定是瓶颈生成树,但瓶 ...