//手写冒泡排序
function handlerSort(arr) {
for(let i = 0; i < arr.length - 1; i ++) {
for(let j = 0; j < arr.length - i -1; j ++) {
if(arr[j] > arr[j + 1]) {
let tempt = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tempt
}
}
}
return arr;
},
//优化1,
function handleSort(arr) {
var flag;
for(let i = 0; i < arr.length - 1; i ++) {
flag = true;
for(let j = 0; j < arr.length - i -1; j ++) {
if(arr[j] > arr[j + 1]) {
let tempt = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tempt;
flag = false;
}
}
}
if(flag) {
//我们可以规定如果某次循环后flag依然为true的话,表明这次没有进行重新的元素交换,也就是说没有进行重新排序,那么此时数组中元素已经有序了,所以我们可以直接break跳出循环,return出数组
break;
}
}
// 优化2
我们每次排序后,数组的后面有一部分已经有序了,所以我们也不需要再和后面已经排好序的元素再进行比较了,我们可以这样做,用一个变量来记录下最后一次发生交换的位置,后面没有发生交换的其实已经有序了,所以可以用这个值来作为一一次我们比较结束时的位置,将会减少很多次没必要的排序过程,代码实现如下:
function handleSort(arr) {
var flag;
var lastIndex = 0;
var k = arr.length - 1;
for(let i = 0; i < arr.length; i ++) {
flag = true;
for(let j = 0; j < k; j ++) {
if(arr[j] > arr[j + 1]) {
let tempt = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tempt;
flag = false;
lastIndex = j;
}
}
k = lastIndex;
}
if(flag) {
//我们可以规定如果某次循环后flag依然为true的话,表明这次没有进行重新的元素交换,也就是说没有进行重新排序,那么此时数组中元素已经有序了,所以我们可以直接break跳出循环,return出数组
break;
}
}