算法的重要性------一道小小编程题

在QQ前端交流群遇到一道小小的编程练习题,很有意思就随便练练手,仔细思考偶然发现里面的奥妙无穷!

【每日思考】给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求:只能在原数组上操作,并且只得循环一遍数组。

拿到题目不假思索的给出自己的思路:数组有两个方法一个往前追加元素,一个往后追加元素,先保存当前遍历元素然后删除并与num比较大小后选择往前追加还是往后追加,for循环次数为原数组长度

于是开始编码:

so ease ? 可是仔细一想发现程序还是可以优化的,既然题目要求是小于 num 的数放在数组左边,那么当我们在检索左边的时候如果发现这个数原本就是小于 num 的时候就可以不用操作,基于这个想法将程序进一步优化。

既然检索左边的时候可以进行判断操作,那么我们进行右边检索的时候不也可以进行一下判断,这时我们可以对数组左右一起进行检索判断。

最后思考一下,我们数组所有元素并没有改变,只是位置发生了变化,这样删了又加的方法明显有点累赘,我们可以直接采用数组赋值的方法来修改数组的位置,当左边发现一个数字大于 num ,同时等待右边发现一个数字小于等于 num 后,我们只需将两个数组元素对调一下位置就行了

扫描二维码关注公众号,回复: 4584057 查看本文章

代码是不是简洁清晰了许多。

下面我们将数组长度扩大到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;
}

猜你喜欢

转载自blog.csdn.net/djz917/article/details/85113893