热门标签 | 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;
};

推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 本文探讨了在Java中如何正确地将多个不同的数组插入到ArrayList中,避免所有数组在插入后变得相同的问题。我们将分析代码中的问题,并提供解决方案。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
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社区 版权所有