如何实现冒泡排序

Posted catEatBird

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现冒泡排序相关的知识,希望对你有一定的参考价值。

 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>

以上是关于如何实现冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

python代码实现鸡尾酒排序(双向冒泡排序)

经典算法学习——链表实现冒泡排序

交换排序(冒泡排序快速排序的算法思想及代码实现)

排序算法之冒泡选择插入排序(Java)

排序算法之冒泡选择插入排序(Java)

66. 冒泡排序如何实现?如何优化?