❶ javascript中的冒泡排序法
AVA气泡分类法
拓展资料
气泡排序的原理是,有五个数字54321,例如从小到大排列。
首先比较前两个,5个和4个,如果第一个小于第二个,没有运算,如果第一个大于第二个,则交换两个位置,即45321个,然后第二个和第三个,交换位置,变成43521个,然后第三个和第四个,第四个和第五个,这样的时间周期下来,转向。进入43215
因此,一个循环的效果是挑选出最大的数字5并将其泡泡到底。但是选择第二,第三等等。因此,一层循环是不够的,它必须是另一层。例如,五个数字,至少四个周期。至于为什么这个,长度-i,是因为第一个比较五个数字,第二个只要第一个四将做,第五个必须是最大的。
var数组=〔5, 4, 3,2, 1〕;
VATP=0;
对于(var i=0;i <数组,长度;i++)
{
对于(var j=0;j<数组,长度-i;j++)
{
IF(数组[j] >数组[j+1])
{
TEMP=数组[J+1 ];
数组[j+2]=数组[j];
数组[j]=TEMP;
}
}
}
控制台,日志(数组);
❷ js几种常见的排序算法
原理:比较两个相邻的元素,将值大的元素交换至右端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。
冒泡排序优化版:
一.选择排序原理
1.每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置
2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到刚才已排序序列的后面。
3.以此类推,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。例如:序列3,3,2,1, 我们知道第一次遍历的时候,选择最后一个元素1和第一个元素3交换,那么原序列中2个3的相对前后顺序就和之前不一样了,所以选择排序不是一个稳定的排序算法。
二.选择排序时间复杂度
第一次循环比较 n - 1次,第二次循环比较 n - 2次,依次类推,最后一个元素不需要比较,因此共进行 n - 1次循环,最后一次循环比较1次。
因此一共比较1 + 2 + 3 + ... +(n - 2)+(n - 1)次,求和得n2/2 - n / 2 ,忽略系数,取最高指数项,该排序的时间复杂度为O(n2)
选择排序优化版:
插入排序:
❸ JS数组排序
JS数组排序方法有两个: reverse() 和 sort() ,其中 reverse() 可将数组进行倒序,而 sort() 则可将数组项灵活地进行升序或降序排列。
可以看出, reverse() 会直接改变原数组,并且返回值也是倒序后的数组。
记得当年学C语言时,要学各种各样的排序算法,比如经典的冒泡排序法、二分排序法等,现在抛开这些算法不说,JS就自带原生的排序函数,用起来非常方便,它就是 sort() 。
可以看出, sort() 不传参数时会按升序方式对数组项进行排序,并且与 reverse() 一样既改变原数组,同时返回的也是排序后的数组。
我们再来看下一个例子:
这时你可能会说,不对呀,最终排序返回的不应该是 [8, 9, 16, 90] 吗?然鹅事实返回的却是 [16, 8, 9, 90] ,这到底是哪门子逻辑?
事实上, sort() 并不是按照数值进行排序,而是按字符串字母的ASCII码值进行比较排序的,所以当数组项为数字时, sort() 也会自动先将数字转换成字符串,然后再按字母比较的规则进行排序处理。
现在我们再回头看看前面两个例子。当 arr 为 [8,4,9,1] 时,数组每一项转换成字符串后进行排序的结果正好与数字排序结果相同;而当 arr 为 [8,90,9,16] 时,数组每一项转换成字符串后就得按顺序一位一位进行比较,比如升序排序时,“16”应该排在最前面,因为“16”的第一位是“1”,比“8”和“9”的ASCII码值都要小。
啰嗦了这么多,其实我们实际很少会使用这种排序方式,而更多的应该就是纯数字的排序。那么我们该如何正确地使用 sort() 来达到预期的排序效果呢?
接下来就来看看传参后的 sort() 能给我们怎样的精彩表现。
这个函数参数功能其实很简单,实际上就是告诉 sort() 排序方式到底是升序还是降序,我们还是来看具体实例吧~
这种用法的规则是,当 sort() 传入函数中的第一个参数a位于第二个参数b之前,则返回一个负数,相等则返回0,a位于b之后则返回正数。
比如,当要做升序排序时,我们需要想到前面的数肯定是要比后面的数小,所以传入的这个函数参数返回值应该要是个负数,因此函数参数返回 a - b 。
如果实在不好理解,我们可以干脆记下来, a - b 升序, b - a 降序,但是需要注意的是,如果按照这种记忆方式的话,函数括号内的两个参数 a 和 b 的书写顺序可不能颠倒哦~
❹ 如何用js代码在页面上实现tr排序
我看有jQuery的语法,就用jQuery类似的,输入的时间没有去校验,格式如2011-4-19 11:35:11
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jQuery</title>
<script language="javascript" type="text/javascript" src="js/jquery-1.4.4.js" ></script>
<script type="text/javascript">
$(document).ready(function()
{
$("#b").click(function(){
var eDate = $("#eDate").val();
$("#t tr").each(function(i){
if(!compareTime($("td:eq(1)",this).html(),eDate) && i==0){ //输入时间小于第一行时间则直接插入到第一行前
$("#t tr").eq(i).before("<tr><td>content</td><td>"+ eDate +"</td></tr>");
return false;
}
else if($("#t tr").size()-1 > i){ //比较第二行到最后前一行,如果是在期间的,插入行
if(compareTime($("td:eq(1)",this).html(),eDate) && !compareTime($("#t tr").eq(i+1).find("td").eq(1).html(),eDate)){
$("#t tr").eq(i+1).before("<tr><td>content</td><td>"+ eDate +"</td></tr>");
return false;
}
else{
return true;
}
}
//输入时间大于所有行的,插入到最后
$("#t").append("<tr><td>content</td><td>"+ eDate +"</td></tr>");
});
});
});
//时间比较函数
function compareTime(startDate, endDate) {
var startDateTemp = startDate.split(" ");
var endDateTemp = endDate.split(" ");
var arrStartDate = startDateTemp[0].split("-");
var arrEndDate = endDateTemp[0].split("-");
var arrStartTime = startDateTemp[1].split(":");
var arrEndTime = endDateTemp[1].split(":");
var allStartDate = new Date(arrStartDate[0], arrStartDate[1], arrStartDate[2], arrStartTime[0], arrStartTime[1], arrStartTime[2]);
var allEndDate = new Date(arrEndDate[0], arrEndDate[1], arrEndDate[2], arrEndTime[0], arrEndTime[1], arrEndTime[2]);
if (allStartDate.getTime() >= allEndDate.getTime()) {
return false;
} else {
return true;
}
}
</script>
</head>
<body>
<input type="text" id="eDate" value="" /><button type="button" id="b">insert</button>
<table width="100%" border="0" cellspacing="0" cellpadding="0" id="t">
<tr>
<td>111</td>
<td>2011-04-19 11:20:00</td>
</tr>
<tr>
<td>aaa</td>
<td>2011-04-19 11:40:00</td>
</tr>
<tr>
<td>3xxx</td>
<td>2011-04-19 13:30:00</td>
</tr>
<tr>
<td>gfedd</td>
<td>2011-04-19 20:50:00</td>
</tr>
</table>
</body>
</html>
❺ js中settimeout 没有停顿效果,一下执行到底
setTimeout(swap(elements[i],elements[j]),1000);这种调用方式,本身就是立即执行swap(elements[i],elements[j]),然后再把返回值作为setTimeout的参数,这肯定是错的。
应该这样:
//定义交换函数
functionswap(a,b){
vartemp=a.style.height;
a.style.height=b.style.height;
b.style.height=temp;
}
//冒泡排序
functionsort(i,j){
varelements=document.getElementById("display").children;
j++;
if(j>=elements.length){
i++;
if(i>=elements.length-1)return;
j=i+1;
}
if(parseInt(elements[i].style.height)<parseInt(elements[j].style.height)){
swap(elements[i],elements[j]);
setTimeout("sort("+i+","+j+")",1000);
}else{
sort(i,j);
}
}
//调用
window.onload=function(){
document.getElementById("sort").onclick=function(){
setTimeout("sort(0,0)",1000);
}
}
❻ js数组排序的几种方法
一、 冒泡排序
平均复杂度:o(n^2) 空间复杂度:o(1) 稳定性:稳定
步骤: 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个;
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样,最后的元素应该会是最大的数;
3、针对所有的元素重复以上的步骤,除了最后一个;
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
二、选择排序
平均复杂度:o(n^2) 空间复杂度:o(1) 稳定性:不稳定
步骤: 1、每一次循环,找到最小的那个数,并用变量记住它的索引
2、然后将最小值放在它该在的位置上
3、持续对越来越少的元素重复上面的步骤
三、插入排序
平均复杂度:o(n^2) 空间复杂度:o(1) 稳定性:稳定
(1)直接插入排序:将第一个数和第二个数排序,然后构成一个有序序列;将第三个数插入进去,构成一个新的有序序列;对第四个数、第五个数......直到最后一个数,重复第二步
(2)二分插入排序:将寻找每个数插入位置的方法改为折半比较即可
四、Shell排序(插入排序的一种,又称为缩小增量排序)
平均复杂度:o(nlogn) 空间复杂度:o(1) 稳定性:不稳定
步骤:把数组按下标的一定增量分组,然后对每组使用直接插入排序
想学习更多前端开发的知识,就来北京尚学堂!
❼ js里写了个冒泡排序 结果没变 大神指导指导小白
传参不对,var s = [1,3,1,4,3];