冒泡排序动画:
手工版
// 第一轮 6次
// 45 67 23 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 21 88 6 99
// 45 23 67 21 6 88 99
// 45 23 67 21 6 88 99
// 第二轮 6次
// 23 45 67 21 6 88 99
// 23 45 67 21 6 88 99
// 23 45 21 67 6 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 第三轮 6次
// 23 45 21 6 67 88 99
// 23 21 45 6 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 第四轮 6次
// 21 23 6 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 第五轮 6次
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第六轮 6次(这个第6轮即使后面已经成型了 它还是按照程序走一遍)
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
基础版
冒泡排序:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
//(双重for循环 第一个for控制轮数 第二个for控制次数 比较的轮数为数据个数-1 一轮比较的次数为数据个数-1 总个数为比较轮数*1轮比较次数)
var a=[45,67,23,88,21,6,99];
var temp=[];
var m=0;//轮数
var n=0;//一共次数
for(var i=0;i<a.length-1;i++){//这里不减1 后面轮数就+1 这是不对的 因为数组下标0开始
for(var j=0;j<a.length-1;j++){
if(a[j]>a[j+1]){//后面的大于前面的 后面再前 前面在后 从小到大
temp=a[j];//a[j]=temp;
a[j]=a[j+1];//a[j+1]=a[j];
a[j+1]=temp;//a[j+1]=temp
//顺序不能调换 因为a[]里面有个下标是一定从小到大的
}
n++
}
m++;
}
//document.write(a.length);
document.write(a+"<br>");
document.write("轮数"+m+"<br>");
document.write("总次数"+n+"<br>");
// a1 a2
// 3 2
// temp
// 2 3
// temp
// 2 3
// temp
// 第一轮 6次
// 45 67 23 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 21 88 6 99
// 45 23 67 21 6 88 99
// 45 23 67 21 6 88 99
// 第二轮 6次
// 23 45 67 21 6 88 99
// 23 45 67 21 6 88 99
// 23 45 21 67 6 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 第三轮 6次
// 23 45 21 6 67 88 99
// 23 21 45 6 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 第四轮 6次
// 21 23 6 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 第五轮 6次
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第六轮 6次(这个第6轮即使后面已经成型了 它还是按照程序走一遍)
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
</script>
</head>
<body>
</body>
</html>
简单优化版
冒泡排序优化://每轮比较少比较一次。(每一轮都会比较出一个最大值,然后后一轮没有必要再比较了,所以没比较一轮,就少比较一次。。。) j<a.length-1-i
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
var a=[45,67,23,88,21,6,99];
var temp=[];
var m=0;//轮数
var n=0;//一共次数
for(var i=0;i<a.length-1;i++){//这里不减1 后面轮数就+1 这是不对的 因为数组下标0开始
for(var j=0;j<a.length-1-i;j++){ //每轮比较少比较一次。(每一轮都会比较出一个最大值,然后后一轮没有必要再比较了,所以没比较一轮,就少比较一次。。。)
if(a[j]>a[j+1]){//后面的大于前面的 后面再前 前面在后 从小到大
temp=a[j];//a[j]=temp;
a[j]=a[j+1];//a[j+1]=a[j];
a[j+1]=temp;//a[j+1]=temp
//顺序不能调换 因为a[]里面有个下标是一定从小到大的
}
n++
}
m++;
}
//document.write(a.length);
document.write(a+"<br>");
document.write("轮数"+m+"<br>");
document.write("总次数"+n+"<br>");
// a1 a2
// 3 2
// temp
// 2 3
// temp
// 2 3
// temp
// 第一轮 6次
// 45 67 23 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 21 88 6 99
// 45 23 67 21 6 88 99
// 45 23 67 21 6 88 99
// 第二轮 6次
// 23 45 67 21 6 88 99
// 23 45 67 21 6 88 99
// 23 45 21 67 6 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 第三轮 6次
// 23 45 21 6 67 88 99
// 23 21 45 6 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 第四轮 6次
// 21 23 6 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 第五轮 6次
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第六轮 6次(这个第6轮即使后面已经成型了 它还是按照程序走一遍)
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第一轮 6次
// 45 67 23 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 21 88 6 99
// 45 23 67 21 6 88 99
// 45 23 67 21 6 88 99
// 第二轮 5次
// 23 45 67 21 6 88 99
// 23 45 67 21 6 88 99
// 23 45 21 67 6 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 第三轮 4次
// 23 45 21 6 67 88 99
// 23 21 45 6 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 第四轮 3次
// 21 23 6 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 第五轮 2次
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第六轮 1次
// 6 21 23 45 67 88 99
</script>
</head>
<body>
</body>
</html>
终极优化版
做一个判断
如果在比较的时候 两两不发生比较了 就退出循环
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
var a=[45,67,23,88,21,6,99];
//var a=[3,2,1,0,6];
//var a=[1,2,4,3,5,6,7,8,9];
var temp=[];
var m=0;//轮数
var n=0;//一共次数
//如果比较完备提前结束比较。(判断,如果本次比较没有移动任何元素,那么说明已经比较完成)
for(var i=0;i<a.length-1;i++){//这里不减1 后面轮数就+1 这是不对的 因为数组下标0开始
//开闭原则。(写在第一个for循环里,是为了,每轮比较初始化bool变量变为true。)
var bool=true;
for(var j=0;j<a.length-1-i;j++){ //每轮比较少比较一次。(每一轮都会比较出一个最大值,然后后一轮没有必要再比较了,所以没比较一轮,就少比较一次。。。)
if(a[j]>a[j+1]){//后面的大于前面的 后面再前 前面在后 从小到大
temp=a[j];//a[j]=temp;
a[j]=a[j+1];//a[j+1]=a[j];
a[j+1]=temp;//a[j+1]=temp
//顺序不能调换 因为a[]里面有个下标是一定从小到大的
bool=false;
}
n++;
}
//bool这个变量默认值为true;如果本轮比较有一对元素相互交换位置,那么也不能跳出循环。
//但是,如果本轮比较没有任何元素相互交换位置,那么说明已经比较完成,可以跳出循环。
m++;
if(bool){
break;
}
}
//document.write(a.length);
document.write(a+"<br>");
document.write("总次数"+n+"<br>");
document.write("轮数"+m+"<br>");
// a1 a2
// 3 2
// temp
// 2 3
// temp
// 2 3
// temp
// 第一轮 6次
// 45 67 23 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 21 88 6 99
// 45 23 67 21 6 88 99
// 45 23 67 21 6 88 99
// 第二轮 6次
// 23 45 67 21 6 88 99
// 23 45 67 21 6 88 99
// 23 45 21 67 6 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 第三轮 6次
// 23 45 21 6 67 88 99
// 23 21 45 6 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 第四轮 6次
// 21 23 6 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 第五轮 6次
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第六轮 6次(这个第6轮即使后面已经成型了 它还是按照程序走一遍)
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第一轮 6次
// 45 67 23 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 21 88 6 99
// 45 23 67 21 6 88 99
// 45 23 67 21 6 88 99
// 第二轮 5次
// 23 45 67 21 6 88 99
// 23 45 67 21 6 88 99
// 23 45 21 67 6 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 第三轮 4次
// 23 45 21 6 67 88 99
// 23 21 45 6 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 第四轮 3次
// 21 23 6 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 第五轮 2次
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第六轮 1次
// 6 21 23 45 67 88 99
</script>
</head>
<body>
</body>
</html>
封装一个函数来让外部来选择是哪种排序方法:
var arr = [35, 2, 4, 5, 6,5,8,9,99,11];
Array.prototype.mySort = function (fn) {
for (var i = 0; i < this.length - 1; i++) {
var isSort = true;
for (var j = 0; j < this.length - i - 1; j++) {
// 封装一个函数让其外部进行选择是哪种方式排序
if (fn(this[j], this[j + 1]) > 0) {
isSort = false;
var temp = this[j];
this[j] = this[j + 1];
this[j + 1] = temp;
}
}
if (isSort) {
break;
}
}
};
arr.mySort(function (a, b) {
// 从小到达 return a - b;
// 从达到小 return b-a;
});
这里加了判断后可以减少外层循环
比如 排序123
基础排序为2轮4次
-i排序为2轮3次(它只舍去了第二轮循环的第二次比较)
bool判断的话为:1轮2次 因为它进行一轮2次比较后发现下一轮没有可比较的了 直接退出循环 输出排序
这样大大的提高效率.