冒泡排序的基本思想是对所有相邻记录的关键字值每一轮进行比效,如果(a[j]>a[j+1]),则将其交换,最终达到有序化。
它是稳定的排序
最坏情况:
**时间复杂度为O(n^2)**是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。
最好情况:
时间复杂度为O[n]。也就是排列前,表本身就是顺序的,则根据改进后 的方法需要进行n-1次比较,没有数据交换。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
function maopaoSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) { // 相邻元素两两对比
let temp = arr[j + 1]; // 元素交换
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
let arr=[2,5,7,3,9,4];
console.log(arr);
console.log(maopaoSort(arr));
</script>
</head>
<body>
</body>
</html>
优化后的冒泡排序
在第一层for循环加入初始化一个exchange交换标志为false,当有交换发生时,则变为true,在第二层for循环结束后加入一个判断,如果为false,即从前往后对比没有交换,证明已经大小顺序正确,即可break来跳出外层for循环。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
//需要排序的数组
var arr = Array(23, 45, 18, 37, 92, 13, 24);
var exchange;//交换标志
for (var i = 0; i <arr.length - 1;i ++) { //最多做n-1趟排序
exchange = false;
for (var j = arr.length - 1; j> i; j--) {
if (arr[j] <arr[j - 1]) {
exchange = true;
var tmp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = tmp;
}
}
//若本趟排序未发生交换,提前终止算法
if (!exchange) {
break;
}
}
alert('数组排序后为:' + arr + ',n共排了' + i+ '趟');
</script>
</head>
<body>
</body>
</html>