热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用JavaScript实现独特排序算法的高效方法

本文探讨了使用JavaScript实现多种经典排序算法的高效方法,包括冒泡排序、选择排序、插入排序、归并排序和快速排序。为了确保代码的结构清晰和可维护性,我们首先定义了一个`ArrayList`类,该类中包含了待排序的数组声明。通过这种方式,我们不仅能够更好地组织代码,还能提高算法的执行效率和可读性。此外,我们还对每种排序算法进行了详细的性能分析和优化建议,以帮助开发者在实际应用中选择最合适的排序方法。

这里用Javascript完成冒泡排序、挑选排序、插入排序、合并排序以及疾速排序这些罕见的排序算法

起首我们给本文商定一个完成的框架:定义一个ArrayList类内里包括排序数组声明、数组元素增加、排序算法完成以及数组输出的要领。

代码框架:

function ArrayList(){
var array=[]; this.inputArraymember=function(){ //将10个大小在1~15的随机数增加到数组中
var ins=0;
for(var i=0;i<10;i++){
ins=Math.floor(Math.random()*15+1);
array.push(ins);
}
}; this.响应的排序算法=function(){...算法的详细完成代码...}; //代码块替代部份 this.toString=function(separator){ //将数组按指定分隔符天生字符串轻易输出
return array.join(separator);
}; } var a = new ArrayList();
a.inputArraymember();
console.log("随机天生的原始数组为:"+a.toString('-'));
a.bubbleSort();
console.log("排序后数组为:"+a.toString('-'));

冒泡排序

用两层轮回,第一层用来纪录盈余的还未排序的数的个数,第二层用来在剩下的未排序的数中找到最大的数并将其放到未排序数的末了面(冒泡)。

代码完成:

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

冒泡排序的时刻复杂度是O(n²)。将以上代码替代文章最先商定的代码框架中的“代码块替代部份”即可用于在调试东西中运转检察代码运转效果。

挑选排序

思绪很简单,每次都找出未排序的数当中最小的数并放在开首,直到一切数的位置肯定下来。说清楚点就是从一切序列中先找到最小的,然后放到第一个位置。以后再看盈余元素中最小的,放到第二个位置……以此类推。

代码完成:

this.selectsort=function(){
var length=array.length,currentMin;
for(var i=0;i currentMin=i; //用来纪录最小数的下标,默以为最最先的未排序的元素下标
for(var j=i;j if(array[currentMin]>array[j]){
currentMin=j;
}
}
if(i!==currentMin){ //若下标不是未排序的最最先的谁人元素的下标,则将二者的值交流
var t=array[currentMin];
array[currentMin]=array[i];
array[i]=t;
}
}
};

可看出,挑选排序也用了两个嵌套着的轮回,所以时刻复杂度也是O(n²),是一种旧址排序。

插入排序

从第二个数最先(由于第一个数只要一个,前面没得比。),与前面的数挨个比较,直到找到前一个数比当前值小,后一个数比当前值大的位置,让后将当前值置于此处,以此类推。

代码完成:

this.insertsort=function(){
var length=array.length, j,temp;
for(var i=1;i j=i;
temp=array[i]; //先存储待比较的数
while(j>0&&array[j-1]>temp){ //假如这个数比上一个数小,则让上一个数占有如今这个数的位置(右移每一个比当前数小的数)
array[j]=array[j-1];
j--
}
array[j]=temp; //直到这个数不比上一个数小的时刻,将这个数放在当前的位置
}
};

合并排序

时刻复杂度为O(nlogn)。合并用的是分治的头脑,将原始数组切分红较小的数组,直到每一个小数组只要一个位置,接着讲小数组合并成较大的数组,直到末了只要一个排序终了的大数组。

代码完成:

this.mergeSort=function() {
array = mergeSortRec(array);
}; //建堆函数,将数组一向拆分红两部份,直到各部份数组长度都为1的时刻住手,然后举行merge操纵
var mergeSortRec = function(array){
var length = array.length;
if (length === 1) {
return array;
}
var mid = Math.floor(length / 2),
left = array.slice(0, mid),//slice() 要领可从已有的数组中返回选定的元素,语法 arrayObject.slice(start,end)
right = array.slice(mid, length);
return merge(mergeSortRec(left), mergeSortRec(right));
};
//将各部份举行合并
var merge = function(left, right) {
var result = [],
il = 0,
ir = 0;
while(il if (left[il] result.push(left[il++]);
} else {
result.push(right[ir++]);
}
}
//假如il数组另有盈余,则将其盈余部份增加到效果数组中
while (il result.push(left[il++]);
}
//假如ir数组另有盈余,则将其盈余部份增加到效果数组中
while (ir result.push(right[ir++]);
}
return result;
};

疾速排序

时刻复杂度为O(logn)。用的是分治的头脑。

代码完成:

this.quickSort = function(){
quick(array, 0, array.length - 1);
};
var partition = function(array, left, right) { //分别历程

//主元的挑选要领最好是随机挑选一个数组想或是挑选中心项,这里挑选中心项
var pivot = array[Math.floor((right + left) / 2)],
i = left,
j = right;
console.log('pivot is ' + pivot + '; left is ' + left + '; right is ' + right);
while (i <= j) {
while (array[i] i++;
console.log('i = ' + i);
}
while (array[j] > pivot) {
j--;
console.log('j = ' + j);
}
if (i <= j) {
console.log('swap ' + array[i] + ' with ' + array[j]);
swapQuickStort(array, i, j);
i++;
j--;
}
}
return i;
};
var swapQuickStort = function(array, index1, index2){
var aux = array[index1];
array[index1] = array[index2];
array[index2] = aux;
};
var quick = function(array, left, right){//将子数组星散为较小值数组和较大值数组
var index;
if (array.length > 1) {
index = partition(array, left, right);
if (left quick(array, left, index - 1);
}
if (index quick(array, index, right);
}
}
return array;
};

推荐阅读
  • 主调|大侠_重温C++ ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • ▶书中第四章部分程序,包括在加上自己补充的代码,有边权有向图的邻接矩阵,FloydWarshall算法可能含负环的有边权有向图任意两点之间的最短路径●有边权有向图的邻接矩阵1 ... [详细]
  • Canvas漫游:碰撞检测与动画模拟
    探索Canvas在Web开发中的应用,通过碰撞检测与动画模拟提升交互体验。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • This post discusses an issue encountered while using the @name annotation in documentation generation, specifically regarding nested class processing and unexpected output. ... [详细]
  • 本文将继续探讨前端开发中常见的算法问题,重点介绍如何将多维数组转换为一维数组以及验证字符串中的括号是否成对出现。通过多种实现方法的解析,帮助开发者更好地理解和掌握这些技巧。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
author-avatar
台艾辉_435
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有