常见算法JS实现

来源:互联网 发布:淘宝客如何设置佣金 编辑:程序博客网 时间:2024/06/03 04:01

本文参考:http://blog.csdn.net/hguisu/article/details/7776068

                  https://segmentfault.com/a/1190000008593715

一.排序算法

概述

排序有内部排序和外部排序。内部排序是数据记录在内存中进行排序;外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。



交换排序-冒泡排序(Bubble Sort)

1.基本思想:

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数一次进行比较和调整,让较大的树往下沉,较小的往上冒。即每当相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

2.排序图示:


3.算法实现:

function bubbleSort(arr) {    var i = arr.length, j;    var tempExchangVal;    while (i > 0) {        for (j = 0; j < i - 1; j++) {            if (arr[j] > arr[j + 1]) {                tempExchangVal = arr[j];                arr[j] = arr[j + 1];                arr[j + 1] = tempExchangVal;            }        }        i--;    }    return arr;}


交换排序-快速排序(Quick Sort)

1.基本思想:

(1)选择一个基准元素,通常选择第一个元素;

(2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素小,另一部分的元素值均比基准值大;

(3)分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序;

2.排序图示:

(1)一趟排序过程:


(2)排序全过程:


3.算法实现:

function quickSort(array){    function sort(prev, numsize){        var  i= prev;        var j = numsize -1;        var flag = array[prev];        if (numsize - prev > 1) {            while(i < j){                for(; i < j; j--){                    if (array[j] < flag) {                        array[i++] = array[j]; //a[i] = a[j]; i += 1;                        break;                    }                }                for( ; i < j; i++){                    if (array[i] > flag){                        array[j--] = array[i];                        break;                    }                }            }            array[i] = flag;            sort(0, i);            sort(i + 1, numsize);        }    }    sort(0, array.length);    return array;}



二.字符串操作

翻转字符串

1.思路:转换成array操作

2.实现

function reverseString(str){    var arr = str.split("");    var i = 0,j = arr.length-1,temp;    while(i<j){        temp = arr[i];        arr[i] = arr[j];        arr[j] = temp;        i++;        j--;    }    return arr.join("");}


生成指定长度随机字符串

1.实现

function randomString(n){    var str = 'abcdefghijklmnopqrstuvwxyz0123456789';    var temp = '';    for(var i=0; i<n; i++) {        temp += str.charAt(Math.round(Math.random()*str.length));    }    return temp;}

三.数组操作

数组去重

1.思路:遍历数组,然后将数组中的项放进一个对象中,通过判断该对象中是否存在某一项来判断数组是否重复。

2.实现

function unique(arr){    var obj = {}    var result = []    for(var i in arr){        if(!obj[arr[i]]){            obj[arr[i]] = true;            result.push(arr[i]);        }    }    return result;}


四.树操作

遍历多叉树

1.实现

var treeNodes = [    {        id: 1,        name: '1',        children: [            {                id: 11,                name: '11',                children: [                    {                        id: 111,                        name: '111',                        children:[]                    },                    {                        id: 112,                        name: '112'                    }                ]            },            {                id: 12,                name: '12',                children: []            }        ]    },    {        id: 2,        name: '2',        children: [            {                id: 22,                name: '22',                children: []            }        ]    }];//递归实现var parseTreeJson = function(treeNodes){    if (!treeNodes || !treeNodes.length) return;    for (var i = 0, len = treeNodes.length; i < len; i++) {        console.log(treeNodes[i].id);        var childs = treeNodes[i].children;        if(childs && childs.length > 0){            parseTreeJson(childs);        }    }};//非递归广度优先实现var iterator1 = function (treeNodes) {    if (!treeNodes || !treeNodes.length) return;    var stack = [],item;    //先将第一层节点放入栈    for (var i = 0, len = treeNodes.length; i < len; i++) {        stack.push(treeNodes[i]);    }    while (stack.length) {        item = stack.shift();        console.log(item.id);        //如果该节点有子节点,继续添加进入栈底        if (item.children && item.children.length) {            stack = stack.concat(item.children);        }    }};//非递归深度优先实现var iterator2 = function (treeNodes) {    if (!treeNodes || !treeNodes.length) return;    var stack = [],item;    //先将第一层节点放入栈    for (var i = 0, len = treeNodes.length; i < len; i++) {        stack.push(treeNodes[i]);    }    while (stack.length) {        item = stack.shift();        console.log(item.id);        //如果该节点有子节点,继续添加进入栈顶        if (item.children && item.children.length) {            stack = item.children.concat(stack);        }    }};console.log('------------- 递归实现 ------------------');parseTreeJson(treeNodes);console.log('------------- 非递归广度优先实现 ------------------');iterator1(treeNodes);console.log('------------- 非递归深度优先实现 ------------------');iterator2(treeNodes);


五.其他常见算法

生成斐波那契数列

1.实现

function getFibonacci(n) {    var fibarr = [];    var i = 0;    while(i < n) {        if(i <= 1) {            fibarr.push(i);        } else {            fibarr.push(fibarr[i - 1] + fibarr[i - 2])        }        i++;    }    return fibarr;}











0 0
原创粉丝点击