当前位置: 首页 > news >正文

数据结构中的各种排序方法-JS实现

   新技术一直在不断变化,掌握一些基础是未来学习不断更新的技术的坚实基础。近来闲来无事,为了温习一下从前学的数据结构,将数据结构中的排序算法用JS实现了一遍,并在本文末尾处嵌入了DEMO。

 
简单排序

冒泡排序

     冒泡排序是最简单排序算法,时间复杂度为n的平方,代码如下:

        function bubbleSort(array) {
            for (var i = 0; i < array.length; i++) {
                for (var j = array.length; j > 0; j--) {
                    if (array[j] < array[j - 1]) {
                        var temp = array[j - 1];
                        array[j - 1] = array[j];
                        array[j] = temp;
                    }

                }
                /* 输出结果 */
                document.write("这是第 + (i + 1) + "次循环·,结果为:");
                for (var k = 0; k < array.length; k++) {
                    document.write(array[k] + ",");
                }
                document.write("<br />");
                /* 输出结果结束 */
            }
        }
 

直接插入排序

    直接插入排序也属于简单排序算法,时间复杂度也为n的平方,但性能略好于冒泡排序,代码如下:

        function insertSort(array) {
            var temp;
            for (var i = 1; i < array.length; i++) {
                var temp = array[i];
                for (var j = i; j > 0 && temp < array[j - 1]; j--) {
                    array[j] = array[j - 1];
                }
                array[j] = temp
                /* 输出结果 */
                document.write("第? + i + "遍排序的结果是:")
                for (var n = 0; n < array.length; n++) {
                    document.write(array[n] + ",");
                }

                document.write("<br />")
                /* 输出结果结束 */

            }
        }
 

选择排序

    选择排序也属于简单排序算法,时间复杂度也为n的平方,性能同样略微好于冒泡排序,代码如下:

        function selectSort(array) {
            var min, temp; ;
            for (var i = 0; i < array.length; i++) {
                min = i;
                for (var j = i + 1; j < array.length; j++) {
                    if (array[min] > array[j])
                        min = j;
                }
                if (min != i) {
                    temp = array[i];
                    array[i] = array[min];
                    array[min] = temp;
                }
                /* 输出结果 */
                document.write("第 + i + "遍排序的结果是:")
                for (var n = 0; n < array.length; n++) {
                    document.write(array[n] + ",");
                }

                document.write("<br />")
                /* 输出结果结束 */

            }
        }
 

复杂排序
 

希尔排序

     希尔排序是插入排序的升级,1959年希尔通过将简单排序中两两比较改为设置步长跳跃式比较而突破了n的平方的时间复杂度,希尔排序根据步长的不同时间复杂度由最好的nlogn到最坏的n的平方。代码如下:

       function shallSort(array) {
           var increment = array.length;
           var i
           var temp; //暂存
           var count = 0;
           do {
               increment = Math.floor(increment / 3) + 1;
               for (i = increment; i < array.length; i++) {
                   if (array[i] < array[i - increment]) {
                       temp = array[i];
                       for (var j = i - increment; j > 0 && temp < array[j]; j -= increment) {

                           array[j + increment] = array[j];

                       }
                       array[j + increment] = temp;
                       /* 输出结果 */
                       count++;
                       document.write("<br />第 + count + "遍排序的结果是:")
                       for (var n = 0; n < array.length; n++) {
                           document.write(array[n] + ",");
                       }
                       /* 输出结果结束 */
                   }
               }
           }
           while (increment > 1)

       }
 

堆排序

      堆排序是选择排序的升级,通过不断构建大顶堆或者小顶堆来选择最大或者最小的值放入队列前端进行排序,堆排序任何情况下的时间复杂度都为nlogn,代码如下:

        function heapSort(array) {
            var temp;
            var i;
            for (i = Math.floor(array.length / 2); i >= 0; i--) {
                heapAdjust(array, i, array.length - 1); //将数组array构建成一个大顶堆
            }
            for (i = array.length - 1; i >= 0; i--) {
                /*把根节点交换出去*/
                temp = array[i];
                array[i] = array[0];
                array[0] = temp;

                /*余下的数组继续构建成大顶堆*/
                heapAdjust(array, 0, i - 1);
                /* 输出结果 */
                document.write("<br />第 + (array.length - i).toString() + "遍排序的结果是:")
                for (var n = 0; n < array.length; n++) {
                    document.write(array[n] + ",");
                }
                /* 输出结果结束 */
            }
        }
        //要调整的子树
        //start为数组开始下标
        //max是数组结束下标
        function heapAdjust(array, start, max) {
            var temp, j;
            temp = array[start];//temp是根节点的值
            for (j = 2 * start; j < max; j *= 2) {
                if (j < max && array[j] < array[j + 1]) {  //取得较大孩子的下标
                    ++j;

                }
                if (temp >= array[j])
                    break;
                array[start] = array[j];
                start = j;
            }
            array[start] = temp;

        }
 

归并排序

     归并排序是复杂排序中唯一一个稳定排序,通过将待排序数组进行分拆再合并来进行排序,归并排序时间复杂度为n的平方,代码如下:

        //source源数组
        //dest目标数组
        //s起始下标
        //t目标下标
        function mSort(source, dest, s, t) {
            var m; //取中间值
            var dest2 = new Array();
            if (s == t) {
                dest[s] = source[s];
             
            }
            else {
                m = Math.floor((s + t) / 2);
                mSort(source, dest2, s, m);
                mSort(source, dest2, m+1 , t);
                merge(dest2, dest, s, m, t);
                /* 输出结果 */
                document.write("<br />第 + ++count + "遍排序的结果是:")
                for (var n = 0; n < dest.length; n++) {
                    document.write(array[n] + ",");
                }
                /* 输出结果结束 */
            }

        }
        
        //将两个数组按照从小到大的顺序融合
        //source原数组
        //dest排序后的数组
        //s第一个下标
        //m第二个数组下标
        //总长度
        function merge(source, dest, s, m, n) {
            for (var j = m+1, k = s; j <= n && s <= m; k++) {
                if (source[s] < source[j]) {
                    dest[k] = source[s++];
                }
                else {
                    dest[k] = source[j++];
                }
            }
           
                //将剩余排不完的有序数组加入到dest的末端
                if (s <= m) {
                    for (var l = 0; l <= m - s; l++) {
                        dest[k + l] = source[s+l];
                    }
                }
                if (j <= n) {
                    for (var l = 0; l <= n - j; l++) {
                        dest[k + l] = source[j+l];
                    }
                
            }
        }
 

快速排序

     快速排序是目前已知的速度最快的排序,时间复杂度为nlogn,代码如下:

        var count = 0;
        function quickSort(array, low, high) {
            var temp;
            
            if (low < high) {

                var keypoint = QuickSortHelp(array, low, high);
                count++;
                document.write("<br />第台? + count + "遍括?排?序ò的?结á果?是?:")
                for (var l = 0; l < array.length; l++) {
                    document.write(array[l] + ",");
                }
                quickSort(array, low, keypoint - 1);
                quickSort(array, keypoint + 1, high);
                

                }
        }
        function QuickSortHelp(array, low, high) {
            while (low < high) {

                while (low < high && array[low] <= array[high]) {
                    high--;
                }
                temp = array[low];
                array[low] = array[high];
                array[high] = temp;
                while (low < high && array[low] <= array[high]) {
                    low++
                }
                temp = array[low];
                array[low] = array[high];
                array[high] = temp;

            }
            return low;
        }
        
 

DEMO
    下面嵌入了demo:

    再次排序需要点清除数组重新添加:

数组内容为:
清为数组添加数字:
添加 清除数组 

冒泡排序 插入排序  选择排序 希尔排序  堆排序 并归排序  快速排序



本文转自CareySon博客园博客,原文链接:http://www.cnblogs.com/CareySon/archive/2011/10/28/2227703.html,如需转载请自行联系原作者

相关文章:

  • Asp.net缓存简介
  • Android鬼点子 使用Kotlin编写的颜色选择器
  • 合唱队形
  • 复选框提交功能
  • [cb]UIGrid+UIStretch的自适应
  • 对于软件生产能解决到痛点的容器技术就是好!Wise2C睿云智合如何运行
  • 从零开始机器学习001-线性回归数学推导
  • 小白接口(OkayApi.com),免开发,直接可用的云端数据接口
  • C++代码书写规范——给新手程序员的一些建议
  • 成为优秀Java程序员的10大技巧
  • 2.6相对和绝对路径 2.7cd命令 2.8创建和删除目录mkdir/rmdir 2.9rm命令
  • debian 8 解压安装mysql(版本5.7.19)
  • 电脑网络连接问题汇总
  • 线程精进指南之线程池进阶
  • ifdef ANDROID总是不好用
  • Android Volley源码解析
  • iOS编译提示和导航提示
  • js
  • js正则,这点儿就够用了
  • Linux后台研发超实用命令总结
  • Linux链接文件
  • MQ框架的比较
  • quasar-framework cnodejs社区
  • React-redux的原理以及使用
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 读懂package.json -- 依赖管理
  • 京东美团研发面经
  • 前嗅ForeSpider教程:创建模板
  • 区块链技术特点之去中心化特性
  • 驱动程序原理
  • 双管齐下,VMware的容器新战略
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • elasticsearch-head插件安装
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 数据可视化之下发图实践
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 安徽锐锋科技IDMS系统简介
  • (1)虚拟机的安装与使用,linux系统安装
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (八)c52学习之旅-中断实验
  • (转载)OpenStack Hacker养成指南
  • *** 2003
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net 代码性能 - (1)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net下简单快捷的数值高低位切换
  • ??myeclipse+tomcat
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • []指针
  • [Android 数据通信] android cmwap接入点
  • [Asp.net mvc]国际化