如何实现冒泡排序
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 8 <body> 9 <script> 10 var arr = [3,2,4,1,5]; 11 12 /* 13 * 每次循环比较,取出当前的值和他的下一位进行大小的比较,如果当前值比下一个要大(小),交换位置,每次循环确定一个最大(最小)数 14 * 15 * 因为每次比较的数列中,最后一个没有下一位,所以最后一次没有必要再参与比较,所以每次循环比较的次数是要比较的数列元素个数-1次 16 * */ 17 for (var i=0; i<arr.length-1; i++) { 18 19 // 获取当前位的值 20 var a = arr[i]; 21 // 获取下一位的值 22 var b = arr[i+1]; 23 24 // 这里我们以小值在后,如果a小于b交换位置 25 if (a < b) { 26 arr[i] = b; 27 arr[i+1] = a; 28 } 29 30 } 31 32 // 进过上面的一轮循环,就确定这个数列中需要比较的值中最小的值 33 console.log(arr); 34 35 </script> 36 </body> 37 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 8 <body> 9 <script> 10 // var arr = [3,2,4,1,5]; 11 12 var arr = []; 13 for (var i=0; i<30000; i++) { 14 arr.push(i); 15 } 16 arr.sort(function () { 17 return Math.random() - 0.5; 18 }); 19 20 /* 21 * 每一轮的比较确定一个值,整个比较过程需要比较的次数是 长度-1,以为最后一轮的值,只有一个了,没有比较在比较了 22 * */ 23 24 /* 25 * 统计循环的总次数 26 * */ 27 var n = 0; 28 29 console.time('a'); 30 for ( var j=0; j<arr.length-1; j++ ) { 31 32 for (var i=0; i<arr.length-1; i++) { 33 var a = arr[i]; 34 var b = arr[i+1]; 35 if (a < b) { 36 arr[i] = b; 37 arr[i+1] = a; 38 } 39 40 n++; 41 } 42 43 } 44 console.timeEnd('a'); 45 46 console.log(n); 47 console.log(arr); 48 49 </script> 50 </body> 51 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 8 <body> 9 <script> 10 //var arr = [3,2,4,1,5]; 11 12 var arr = []; 13 for (var i=0; i<30000; i++) { 14 arr.push(i); 15 } 16 arr.sort(function () { 17 return Math.random() - 0.5; 18 }); 19 20 var n = 0; 21 22 console.time('a'); 23 for ( var j=0; j<arr.length-1; j++ ) { 24 25 /* 26 * 随着大的循环的次数的增加,对应的小的循环就应该减少,减少j次 27 * */ 28 for (var i=0; i<arr.length-1-j; i++) { 29 var a = arr[i]; 30 var b = arr[i+1]; 31 if (a < b) { 32 arr[i] = b; 33 arr[i+1] = a; 34 } 35 36 n++; 37 38 } 39 40 } 41 console.timeEnd('a'); 42 43 console.log(n); 44 console.log(arr); 45 46 </script> 47 </body> 48 </html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
// var arr = [3,2,4,1,5];
// var arr = [5,4,3,1,2];
var arr = [];
for (var i=0; i<30000; i++) {
arr.unshift(i);
}
arr[29999] = 1;
arr[29998] = 0;
// arr.sort(function () {
// return Math.random() - 0.5;
// });
var n = 0;
console.time('a');
for ( var j=0; j<arr.length-1; j++ ) {
/*
* 随着大的循环的次数的增加,对应的小的循环就应该减少,减少j次
* */
/*
* 每次比较小的循环的时候,设置flag为真,表示已经排序好了,假设排序是ok的
* */
var flag = true;
for (var i=0; i<arr.length-1-j; i++) {
var a = arr[i];
var b = arr[i+1];
if (a < b) {
/*
* 如果比较过程中走了if条件,那么就说明比较未完成,还需要下次再比较,否则就是交换位置没有发生过,表示数据已经排序好了
* */
/*
* 只要走了if,表示有交换,就把flag设置false
* */
flag = false;
arr[i] = b;
arr[i+1] = a;
}
n++;
}
/*
* 循环完成以后,看下flag的值,如果还保持true,则说明上面循环是没有交换的情况发生的,表示排序ok了,如果为false就表示有过交换
* */
if (flag) {
break;
}
}
console.timeEnd('a');
console.log(n);
console.log(arr);
</script>
</body>
</html>