在QQ前端交流群遇到一道小小的编程练习题,很有意思就随便练练手,仔细思考偶然发现里面的奥妙无穷!
【每日思考】给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求:只能在原数组上操作,并且只得循环一遍数组。
拿到题目不假思索的给出自己的思路:数组有两个方法一个往前追加元素,一个往后追加元素,先保存当前遍历元素然后删除并与num比较大小后选择往前追加还是往后追加,for循环次数为原数组长度
于是开始编码:
so ease ? 可是仔细一想发现程序还是可以优化的,既然题目要求是小于 num 的数放在数组左边,那么当我们在检索左边的时候如果发现这个数原本就是小于 num 的时候就可以不用操作,基于这个想法将程序进一步优化。
既然检索左边的时候可以进行判断操作,那么我们进行右边检索的时候不也可以进行一下判断,这时我们可以对数组左右一起进行检索判断。
最后思考一下,我们数组所有元素并没有改变,只是位置发生了变化,这样删了又加的方法明显有点累赘,我们可以直接采用数组赋值的方法来修改数组的位置,当左边发现一个数字大于 num ,同时等待右边发现一个数字小于等于 num 后,我们只需将两个数组元素对调一下位置就行了
代码是不是简洁清晰了许多。
下面我们将数组长度扩大到22800来比较每种方法用时,结果如下:
1.
2.
3.
4.
对比所用时间我们会发现,虽然1-2-3的改进我们所用时间缩减了大概一半,但是第四种方法只用了 4ms,这就是算法给程序运行带来的效率影响。
function stor1(arr) {
var time1 = new Date();
var middle;
for (var i = 0; i < end; i++) {
middle = arr[star];
if (middle > num) {
arr.splice(star, 1);
arr.push(middle);
} else {
arr.splice(star++, 1);
arr.unshift(middle);
}
}
var time2 = new Date();
document.write('我是所用时间' + (time2 - time1) + 'ms')
return arr;
}
function stor2(arr) {
var time1 = new Date();
var number = Math.ceil(end / 2);
var middle;
for (var i = 0; i < end; i++) {
middle = arr[star];
if (i < number) {
if (middle > num) {
arr.splice(star, 1);
arr.push(middle);
} else {
star++
}
} else {
if (middle <= num) {
arr.splice(star++, 1);
arr.unshift(middle);
} else {
arr.splice(star, 1);
arr.push(middle);
}
}
}
var time2 = new Date();
document.write('我是所用时间' + (time2 - time1) + 'ms')
return arr;
}
function stor3(arr) {
var time1 = new Date();
var number = Math.ceil(end / 2);
var middle, bottom;
for (var i = 0; i < number; i++) {
middle = arr[star];
bottom = arr[end];
if (middle > num) {
arr.splice(star, 1);
arr.push(middle);
end--;
} else {
star++
}
if (bottom <= num) {
arr.splice(end, 1);
arr.unshift(bottom);
star++;
} else {
end--
}
}
var time2 = new Date();
document.write('我是所用时间' + (time2 - time1) + 'ms')
return arr;
}
function stor4(arr) {
var time1 = new Date();
while (star < end) {
if (arr[star] <= num) {
star++
}
if (arr[end] > num) {
end--
}
if (star < end && arr[star] > num && arr[end] <= num) {
var middle = arr[star];
arr[star] = arr[end];
arr[end] = middle;
star++;
end--;
}
}
var time2 = new Date();
document.write('我是所用时间' + (time2 - time1) + 'ms')
return arr;
}