排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序,外部排序是因排序的数据很大,一次不能够容纳全部的排序记录,在排序中需要访问外存。常见的内部排序算法有插入排序,选择排序,冒泡排序,归并排序,快速排序,堆排序。

算法一:插入排序

算法步骤:

1.将第一待排序序列第一个元素看做一个有序数列,把第二个元素到最后一个元素当做未排序序列。

2.从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列适当位置中(如果待插入的元素与有序数列中的某个元素相等,则待插入元素插入到相等元素的后面)

例如:19 2 8 11 24 6

2 19

2 8 19

2 8 11 19

2 8 11 19 24

2 6 8 11 19 24

代码实现:

var arr=[77,56,3,8,4];
function compare(arr){
    var newArr=[];
    newArr.push(arr[0]);//77
    for(var i=1;i<arr.length;i++){
        newArr.push(arr[i]);//56---77 56
        for(var j=newArr.length-2;j>=0;j--){
            if(newArr[j+1]<newArr[j]){
                var temp = newArr[j];
                newArr[j] = newArr[j+1];
                newArr[j+1] = temp;//56 77
            }
        }
    }
    console.log(newArr);
}
compare(arr);

算法二:冒泡排序

算法步骤:

1.比较相邻的元素,如果第一个比第二个大,就交换他们两个

2.对每一对相邻的元素作同样的工作,从开始第一对到结尾的最后一对,这步做完后,最后的元素会是最大的数

3.针对所有的元素重复以上步骤,除了最后一个

4.持续对每次越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

代码示例:

var a=[38,9,2,14,6];
for(var i=0;i<a.length;i++){
    for(var j=0;j<a.length-1;j++){
        if(a[j+1]>a[j]){
            a[j]=a[j]+a[j+1];
            a[j+1]=a[j]-a[j+1];
            a[j]=a[j]-a[j+1];
        }
    }
    console.log(a[i]);
}

算法三:快速排序

算法步骤:

1.从数列中挑出一个元素,称为基准

2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有愿所有比基准值大的摆在基准的后面(相同的数可以到任意一边),在这个分区退出之后,该基准就处于数列的中间位置,这个称之为分区操作。

3.递归的把所有小于基准值元素的子数列和大于基准值元素的子数列排序

递归的最底部情形是数列的大小是0或1,也就是永远都已经被排序好了,虽然一直递归下去,但这个方法总会退出,因为在每次的迭代中,它至少把一个元素摆到它最后的位置去。

代码示例:

function qSort(a,left,right){
    var mid = a[left];
    while(left<right){
        while(a[right]>mid&&left<right)right--;
        if(left<right)
            a[left++]=a[right];
        while(a[left]<mid&&left<right) left++;
        if(left<right)
            a[right--]=a[left];
    }
    a[left] = mid;
    return left;
}
function quickSort(a,left,right){
    if(left<right){
        var mid = qSort(a,left,right);
        quickSort(a,left,mid-1);
        quickSort(a,mid+1,right);
    }
}
    var a=[25,79,44,11,36,42,8];
    quickSort(a,0, a.length-1);
    for(var i=0; i< a.length;i++){
        console.log(a[i]);
    }

算法四:堆排序

算法步骤:

1.创建一个堆

2.把堆首和堆尾互换

3.把堆的尺寸缩小1,并调用shift-down(0),目的是把新的数组顶端数据调整到相应的位置

4.重复步骤2,直到堆的尺寸为1

代码示例:

function headAdjust(elements, pos, len){
    var swap = elements[pos];
    var child = pos * 2 + 1;
    while(child < len){
        if(child + 1 < len && elements[child] < elements[child + 1]){
            child += 1;
        }
        if(elements[pos] < elements[child]){
            elements[pos] = elements[child];
            pos = child;
            child = pos * 2 + 1;
        }
        else{
            break;
        }
        elements[pos] = swap;
    }
}
function buildHeap(elements){
    for(var i=elements.length/2; i>=0; i--){
        headAdjust(elements, i, elements.length);
    }
}
function sort(elements){
    buildHeap(elements);
    for(var i=elements.length-1; i>0; i--){
        var swap = elements[i];
        elements[i] = elements[0];
        elements[0] = swap;
        headAdjust(elements, 0, i);
    }
}
var elements = [33, 17, 25, 77, 42, 24, 59, 16, 1, 38];
sort(elements);
console.log(elements);

算法五:归并排序

算法步骤:

1.申请空间,使其大小为两个排序序列之和,该空间用来存放合并后的数列

2.设定两个指针,最初位置分别是两个已经排序序列的起始位置

3.比较两个指针所指向的元素,选择相对小的元素放到合并空间,并移动指针到下一位置

4.重复步骤3直到某一指针达到序列尾

5.将另一序列剩下的所有元素直接复制到合并序列尾

代码示例:

function mergeSort(arr){
    if(arr.length<2){
        return arr;
    }
    var middle = Math.floor(arr.length/2);
    var left = arr.slice(0,middle);
    var right = arr.slice(middle,arr.length);
    return merge(mergeSort(left),mergeSort(right));
}
function merge(left,right){
    var newArr = [];
    while(left.length&&right.length){
        if(left[0] <= right[0]){
            newArr.push(left.shift());
        }else{
            newArr.push(right.shift());
        }
    }
    while(left.length){
        newArr.push(left.shift());
    }
    while(right.length){
        newArr.push(right.shift());
    }
    return newArr;
}
var arr = [14,88,41,6,45,21];
console.log(mergeSort(arr));

算法六:选择排序

算法步骤:
1.首先在未排序序列中找到最大或最小元素,存放到序列起始位置

2.再从剩余序列中找到最大或最小元素放到已排序序列末尾

3.重复第二步,直到所有元素都排序完毕

代码示例:

function choseSort(a){
    for(var j=0;j< a.length-1;j++){
        var index = j;
        for(var i=j;i< a.length;i++){
            if(a[i]<a[index]){
                index = i;
            }
        }
        var temp = a[j];
        a[j] = a[index];
        a[index] = temp;
    }
    return a[j];
}
var a = [15,2,41,30,9,14];
choseSort(a);
for(var i=0;i< a.length;i++){
    console.log(a[i]);
}

JS实现排序的更多相关文章

  1. 转:js,jQuery 排序的实现,网页标签排序的实现,标签排序

    js,jQuery 排序的实现: 重点: 想要实现排序,最简单的方法就是 先把标签用jQuery读进对象数组 用js排序好对象数组 (针对对象数组进行排序, 不要试图直接对网页的内容进行直接更改) 用 ...

  2. js拼音排序

    js拼音排序 var arr =['a','c','b','b']; arr.sort( function compareFunction(p1, p2) { return p1.localeComp ...

  3. Table Dragger - 简单的 JS 拖放排序表格插件

    Table Dragger 是一个极简的实现拖放排序的表格插件,纯 JavaScript 库,不依赖 jQuery.用于构建操作方便的拖放排序功能,超级容易设置,有平滑的动画,支持触摸事件. 在线演示 ...

  4. [js] - 关于js的排序sort

    js的排序sort并不能一次排序好 function solution(nums){ return nums.sort(sortNumber); } function sortNumber(a, b) ...

  5. JS优先队列排序。出队时,先找出优先级最高的元素,再按照先进先出出队。

    JS优先队列排序.出队时,先找出优先级最高的元素,再按照先进先出出队. /* * 优先队列 * 出队时,先找出优先级最高的元素,再按照先进先出出队. * */ function Queue(){ th ...

  6. Js中文排序(拼音首字母)

    演示地址:http://lar5.sinaapp.com/ 1.index.html <html xmlns="http://www.w3.org/1999/xhtml"&g ...

  7. js自定义排序

    摘要 有个js对象数组 var ary=[{id:1,name:"b"},{id:2,name:"b"}] 需求是根据name 或者 id的值来排序,这里有个风 ...

  8. js简单排序

    简单的排序功能 HTML代码: <body> <input id="btn1" type="button" value="排序&qu ...

  9. C#,js数据排序及其操作

    List<int> listint=new List<int>{2,1,7,3,8,5,4,6};listint.Sort((x, y) => x - y); var a ...

  10. JS 随机排序算法

    https://www.cnblogs.com/getdaydayup/p/6592154.html 使用JS编写一个方法 让数组中的元素每次刷新随机排列 法一: var arr =[1,2,3,4] ...

随机推荐

  1. Alamofire源码解读系列(六)之Task代理(TaskDelegate)

    本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...

  2. linux 私房菜 CH5 笔记

    知识点 linux 大小写敏感 接口的切换 [Ctrl] + [Alt] + [F1] ~ [F6] :文字接口登入 tty1 ~ tty6 终端机: [Ctrl] + [Alt] + [F7] :图 ...

  3. [原创]ASM动态修改JAVA函数之函数字节码初探

    ASM是非常强大的JAVA字节码生成和修改工具,具有性能优异.文档齐全.比较易用等优点.官方网站:http://asm.ow2.org/ 要想熟练的使用ASM,需要对java字节码有一定的了解,本文重 ...

  4. 浩哥解析MyBatis源码(一)——执行流程

    原创作品,可以转载,但是请标注出处地址: 一.MyBatis简介 MyBatis框架是一种轻量级的ORM框架,当下十分流行,配合Spring+Spring MVC组成SSM框架,能够胜任几乎所有的项目 ...

  5. xgboost-python参数深入理解

    由于在工作中应用到xgboost做特征训练预测,因此需要深入理解xgboost训练过程中的参数的意思和影响. 通过search,https://www.analyticsvidhya.com/blog ...

  6. pyqt样式表语法笔记(中)--原创

    pyqt样式表语法笔记(中) pyqt QSS python 样式表 一.弹窗 在日常的各种桌面软件的使用中,我们都会碰到弹窗.例如注册,登录的时候,会有相应的信息弹窗,这里就以信息收集弹窗为例进行弹 ...

  7. 分解机(Factorization Machines)推荐算法原理

    对于分解机(Factorization Machines,FM)推荐算法原理,本来想自己单独写一篇的.但是看到peghoty写的FM不光简单易懂,而且排版也非常好,因此转载过来,自己就不再单独写FM了 ...

  8. QQ登陆接口

    这次做了一个QQ登陆接口---简单记录一下 遇到一大坑-----QQ互联里面添加应用的时候,是网站应用,配置回调地址一定要配置  准确,到指定回调页面 否则会出现问题的.

  9. Object-C定时器,封装GCD定时器的必要性!!! (二)

    上一篇:Object-C定时器,封装GCD定时器的必要性!!! (一) 上一篇认识了Object-C中的几种定时器,这一篇将Dispatch定时器(GCD定时器)封装起来. p.p1 { margin ...

  10. Java基础之面试题

    本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能 ...