代码:
<script>
var arr = [1, 4, 7, 3, 5, 6];
// 记录比较遍数
var bian = 0;
// 记录比较的次数
var ci = 0;
// 本来有6个数,需要比较5遍,即arr.length-1遍,这样从右往左由大到小依次排好了5个数,所以第5遍时确定了第5个数,第6个数就不用排了。
for (var i = 0; i < arr.length - 1; i++) {
// 可是有可能未满5遍就排好了序,因此做一个标记,判断它这一遍是否排好了序
var flag = true;
bian++;
// 每次两两比较,每遍比较了(6-1-i)次,即arr.length-1-i;
for (var j = 0; j < arr.length - 1 - i; j++) {
ci++;
// 当前一个数大于后一个数时,两数交换
if (arr[j] > arr[j + 1]) {
flag = false;
var t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
if (flag == true) {
// 当flag仍然等于true时,说明未进入内层for循环中的if语句,即已经排好了序
break;
}
}
// 打印比较遍数
console.log(bian);
// 打印比较次数
console.log(ci);
// 打印排序过后的数组
console.log(arr);
</script>
控制台:
原数组:1,4,7,3,5,6
第一遍:1,4,3,5,6,7(排好了最后一个数)(比较了5次)
第二遍:1,3,4,5,6,7(排好了倒数第二个数)(比较了4次)
第三遍:1,3,4,5,6,7(这一遍两两比较后发现已经排好了序,因此跳出循环)(比较了3次)
遍数:3
次数:5+4+3=12