自己写的JS排序算法

这学期刚刚学完数据结构,之前就自己写了一点东西,现在整理一下。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>JS实现排序</title>
    <meta name="description" content="用JS自己写的排序算法">
    <meta name="keywords" content="JS,排序">
</head>

<body>
    <script type="text/javascript">
    //从小到大排序
    var a = [9, 2, 4, 1, 8, 7, 5, 3, 6];
    //第一种:简单冒泡排序
    function bubbleSort0(ar) {
        for (var i = 0; i < ar.length - 1; i++) { //a.length长的数组只要进行a.length-1次排序,0-a.length-2刚好为a.length-1的长度
            for (var j = i + 1; j < ar.length; j++) {
                if (a[i] > a[j]) {
                    a[i] ^= a[j]; //交换两个数
                    a[j] ^= a[i];
                    a[i] ^= a[j];
                }
            }
        }
    }
    bubbleSort0(a);
    console.log("简单冒泡排序:" + a);

    //第二种:正宗冒泡排序
    var a = [9, 2, 4, 1, 8, 7, 5, 3, 6];
    function bubbleSort(ar) {
        var flag = true;
        for (var i = 0; i < ar.length - 1 && flag; i++) { //a.length长的数组只要进行a.length-1次排序,0-a.length-2刚好为a.length-1的长度
            for (var j = ar.length - 1; j > i; j--) { //判断条件与下面的判断条件的边界值需要注意
                flag = false; //默认标志为false,则当不进入下面括号的时候代表i之后的数已经排好了序,这里用的是上一轮排序的结果
                if (a[j] < a[j - 1]) {
                    a[j] ^= a[j - 1];
                    a[j - 1] ^= a[j];
                    a[j] ^= a[j - 1];
                    flag = true; //当i后面有数据交换的时候则认为排序没有完成
                }
            }
        }
    }
    bubbleSort(a);
    console.log("正宗冒泡排序:" + a);

    //第三种:简单选择排序
    var a = [9, 2, 4, 1, 8, 7, 5, 3, 6];

    function selectSort(ar) {
        for (var i = 0; i < ar.length - 1; i++) {
            var temp = i;
            for (var j = i + 1; j < ar.length; j++) {
                if (a[j] < a[temp])
                    temp = j;
            }
            if (temp != i) {
                a[i] ^= a[temp];
                a[temp] ^= a[i];
                a[i] ^= a[temp];
            }
        }
    }
    selectSort(a);
    console.log("简单选择排序:" + a);

    //第四种:插入排序
    var a = [0, 9, 2, 4, 1, 8, 7, 5, 3, 6]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
    function insertSort(ar) {
        for (var i = 2; i < ar.length; i++) { //假设a[1]为已经排好序的数列,虽然只有一个数
            if (a[i] < a[i - 1]) { //当后面的数比前面的数小的时候
                a[0] = a[i];
                for (var j = i - 1; a[j] > a[0]; j--) //暂存位还可以起到比较的作用
                    a[j + 1] = a[j];
                a[j + 1] = a[0];
            }
        }
        a[0] = 0; //小洁癖,还原暂存数位为0,美观
    }
    insertSort(a);
    console.log("插入排序:" + a);

    //第五种:希尔排序
    var a = [0, 9, 2, 4, 1, 8, 7, 5, 3, 6]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
    function shellSort(ar) {
        var incre = ar.length - 1; //初始化递增量为数组内排序的数字的长度,不包括暂存位
        do {
            incre = parseInt(incre / 3) + 1; //经研究递增量为n/3+1,n/9+1,n/27+1……时的排序效率最高,这里取n/3+1方法
            for (var i = incre + 1; i <= ar.length - 1; i++) {
                if (a[i] < a[i - incre]) {
                    a[0] = a[i];
                    for (var j = i - incre; j > 0 && a[j] > a[0]; j -= incre)
                        a[j + incre] = a[j];
                    a[j + incre] = a[0];
                }
            }
        } while (incre > 1);
        a[0] = 0;
    }
    shellSort(a);
    console.log("希尔排序:" + a);

    //第六种:基数排序
    var b = [337, 332, 132, 267, 262, 164, 260, 167, 2000]; //测试基数排序的数组,定义大一点
    function radixSort(arr) {
        var i, j, k, lsd;
        var n = 1; //变量n,每次递增10倍
        var t = 1; //数字的最大位数递增量,从个位开始
        var temp = new Array(10); //创建一维数组
        var count = new Array(10);
        for (i = 0; i < 10; i++) {
            temp[i] = new Array(arr.length); //创建二维数组
        }
        for (i = 0; i < 10; i++) { //初始化二维数组和计数数组
            count[i] = 0;
            for (j = 0; j < arr.length; j++)
                temp[i][j] = 0;
        }
        var numLength = getNumberLength(arr); //得到数的宽度,比如[337,1,22]得到为3,函数放在基数排序函数radixSort的最后
        while (t++ <= numLength) { //这里循环数组数字的位数进行统计和收集

            for (j = 0; j < arr.length; j++) { //统计
                lsd = parseInt((arr[j] / n) % 10); //取得当前位数的数字
                temp[lsd][count[lsd]++] = arr[j]; //将其存入二维数组temp
            }
            for (i = 0, k = 0; i < 10; i++) { //收集二维数组的计数存入原来的数组
                if (count[i] != 0) //当前的数字统计有数
                    for (j = 0; j < count[i]; j++) //***计数数组的作用体现了,不用每次都把二维数组temp置0
                        arr[k++] = temp[i][j];
                count[i] = 0;
            }
            n *= 10; //统计后一位数组
        }

        function getNumberLength(a) { //计算数组的数字的最大长度,比如[337,1,22]得到为3,放在最后没关系,JS有隐式提升
            var numberLength, max = 0;
            for (var i = 0; i < a.length; i++) {
                var temp = a[i];
                numberLength = 0;
                while (temp >= 10) {
                    temp /= 10;
                    numberLength++;
                    if (temp < 10) {
                        numberLength++;
                        break;
                    }
                }
                if (numberLength > max)
                    max = numberLength;
            }
            return max;
        }
    }
    radixSort(b);
    console.log("基数排序:" + b);

    //第七种:快速排序
    var a = [10, 90, 20, 40, 50, 80, 70, 30, 60]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
    function quickSort(ar, low, high) {
            var povit;
            if (low < high) {
                povit = partition(ar, low, high);
                quickSort(ar, low, povit - 1);
                quickSort(ar, povit + 1, high);
            }
        }
        //求枢轴
    function partition(ar, low, high) {
        var povitkey;
        povitkey = ar[low]; //取最低的数作为枢轴
        var temp;
        while (low < high) {
            while (low < high && ar[high] >= povitkey)
                high--;
            if (ar[high] != ar[low]) {
                ar[high] ^= ar[low];
                ar[low] ^= ar[high];
                ar[high] ^= ar[low];
            }
            while (low < high && ar[low] <= povitkey)
                low++;
            if (ar[high] != ar[low]) {
                ar[high] ^= ar[low];
                ar[low] ^= ar[high];
                ar[high] ^= ar[low];
            }
        }
        return low;
    }
    quickSort(a, 0, a.length - 1);
    console.log("快速排序:" + a);

    //第八种:堆排序
    var a = [0, 50, 10, 90, 30, 70, 40, 80, 60, 20]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
    function heapSort(ar) {
        var i;
        for (i = parseInt((ar.length - 1) / 2); i > 0; i--) { //构建大顶堆
            heapAdjust(ar, i, ar.length - 1);
        }
        for (i = ar.length - 1; i > 1; i--) {
            //交换两个数,ar[1]和ar[i]
            ar[1] ^= ar[i];
            ar[i] ^= ar[1];
            ar[1] ^= ar[i];
            heapAdjust(ar, 1, i - 1);
        }
    }

    function heapAdjust(ar, s, m) { //s为上标,m为下标
        var temp, j;
        temp = ar[s];
        for (j = 2 * s; j <= m; j *= 2) {
            if (j < m && ar[j + 1] > ar[j]) //当右孩子比左孩子大的时候
                j++;
            if (temp > ar[j])
                break;
            ar[s] = ar[j];
            s = j;
        }
        ar[s] = temp;
    }
    heapSort(a);
    console.log("堆排序:" + a);

    //第八种:堆排序改进
    var a = [50, 10, 90, 30, 70, 40, 80, 60, 20]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
    function heapSort(ar) {
        var i;
        for (i = parseInt((ar.length - 1) / 2) - 1; i >= 0; i--) { //构建大顶堆
            heapAdjust(ar, i, ar.length - 1);
        }
        for (i = ar.length - 1; i >= 1; i--) {
            //交换两个数,ar[1]和ar[i]
            ar[0] ^= ar[i];
            ar[i] ^= ar[0];
            ar[0] ^= ar[i];
            if (i !== 1)
                heapAdjust(ar, 0, i - 1);
        }
    }

    function heapAdjust(ar, s, m) { //s为上标,m为下标
        var temp, j;
        temp = ar[s];
        for (j = 2 * s; j <= m; j *= 2) {
            if (j < m && ar[j + 1] > ar[j]) //当右孩子比左孩子大的时候
                j++;
            if (temp > ar[j])
                break;
            ar[s] = ar[j];
            s = j;
        }
        ar[s] = temp;
    }
    heapSort(a);
    console.log("堆排序改进:" + a);
    </script>
</body>

</html>

也不知道是不是最好的排序算法,学的时候是用的C语言写的,C语言的版本后面再整理吧,这里的都是JS的。

感觉高级语言封装好了太多东西,像排序只要一个sort方法就搞定了,但是自己写完才知道,后面封装了太多东西,一个排序方法可能Brenden Eich(JS发明者)已经写了几百行代码。

像Java,C#等等都封装了太多的基本代码在里面,感觉我们开发项目就是在组装电脑,拿起内存和硬盘看下型号插插插。最后剩下的就只有动手能力了。

keep fighting!:)

时间: 2024-08-14 06:46:44

自己写的JS排序算法的相关文章

用Java来写常见的排序算法

随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * * @author huwei * */ public class Sort { public static void main(String[] args) { int[] a = { 60, 57, 89, 47, 57, 98, 45, 35, 73 }; Sort sort = new So

js排序算法

利用js来实现一些常见的排序算法,在面试中问得还是挺多的,下面我就其进行了简单的总结. sort()方法 首先要讲讲JS数组排序的sort方法,它实现的原理是通过两两比较的方法,sort()方法按升序排列数组项,即最小的值位于最前面,最大的值位于最后面,为了实现排序,sort()方法会调用每个数组项的toString()方法,然后比较得到的字符串,即使数组中的每一项都是数值,sort方法比较的也是字符串.因此有必要定义一个比较函数: function compare(value1,value2)

JS 排序算法整理

关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { for (var i = 0, len = arr.length; i < len - 1; i++) { for (var j = i + 1; j < len; j++) { if (arr[i] > arr[j]) { var temp = arr[i]; arr[i] = arr[j

写完这个排序算法,老板就叫我滚蛋…

最近贴吧有个神奇的帖子,有一程序员网友发称: 老板有毛病吧,写完排序就叫我走人,我还嫌你这 9K 工资低了呢 然后附上他的排序算法代码,如下: 他也附上了输出结果: 乍一看,没毛病呀~ 发帖人还感叹:「现在的老板真不靠谱!」 网友评论: @仰望黎明之光:这脑回路,简直是程序员界的一股清流啊,9K说的是年薪吧640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png @dunziyang:多高端呀,都用上多线程了640?wx_fmt=png @哇矢泽妮可:宝才,公司捡到鬼

结构-行为-样式-Js排序算法之 直接插入排序

最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n>=2)个值已经排序好了,那我们就从第n+1个与前面进行比较,当  a[n+1] > a [i] && a[n+1] < a[i-1] 的时候则进行插入,以此类推. var arr = [23,85,61,37,55,12,63,12,99,39,70,21]; function

js排序算法总结——冒泡,快速,选择,插入,希尔,归并

相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放在前面: 如 var arr = [7, 3, 10, 1, 8, 4, 2, 4, 4, 3] 进行升序排列,排序过程如下 第一次 [3, 7, 1, 8, 4, 2, 4, 4, 3, 10] 第二次 [3, 1, 7, 4, 2, 4, 4, 3, 8, 10] 以此类推 .... 结果 [1

JS排序算法总结:八种算法对比

目的:掌握 排序算法的分类及不同算法复杂度的对比.搞清楚 XXX与数组初始状态无关分为几种情况: a.算法复杂度与初始状态无关: b.元素总比较次数与初始状态无关: c.元素总移动次数与初始状态无关. 1.算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间

js排序算法基础--快速排序

快速排序 快速排序也是最常用的排序算法,和归并算法一样,快速排序也采用分治的方法,将原始数组分为较小的数组.(但是并没有像归并排序那样将它们分开) 思路: 1.从数组中选择中间一项作为主元: 2.创建两个指针,左边一个指向数组的第一项,右边指向数组最后一项.移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素.然后交换它们,重复这个过程,直到左指针超过了右指针.这个过程是的比主元小的值都排在了主元之前,而比主元大的值都排在了主元之后,这一步叫划分操作. 3.接着,

js排序算法04——归并排序

归并排序是一种分治算法.思想是把原数组切分成较小的数组,直到每个小数组只有一个位置,再将小数组归并成较大的数组,直到最后有一个完整有序的大数组. js实现如下: function mergeSort(arr){ if(arr.length==1){ return arr; //长度为1直接返回 } else if(arr.length==2){ var ar0=arr[0]; var ar1=arr[1]; arr[0]=ar0<=ar1?ar0:ar1; arr[1]=ar0>ar1?ar0