JavaScript实现快速排序
《数据结构》中快速排序定义:是对起泡排序的一种改进。它的基本思想是:通过一趟排序将待排记录分割成两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分继续进行排序,以达到整个序列有序。
简单来说,快速排序分三步:1.找准枢轴(pivot);2.把小于枢轴的元素移到其左边,比它大的元素移到右遍;3.然后对两个左右子集不断进行第一步和第二步的操作,直到剩下一个元素。
JavaScript实现代码:
<script type="text/javascript">
var quickSort=function (arr)
{
if(arr.length<=1)
{
return arr;
}
var pivotIndex=Math.floor(arr.length/2);
var pivot=arr.splice(pivotIndex,1)[0];
var left=[];
var right=[];
for(var i=0;i<arr.length;i++)
{
if(pivot>=arr[i])
{
left.push(arr[i]);
}
else
{
right.push(arr[i]);
}
}
return arguments.callee(left).concat ([pivot],quickSort(right)) ;
}
var arr=[15,36,12,54,11,2,89];
console.log(quickSort(arr));
</script>
在获得基准元素这一步:我曾用了数组的slice()方法 这个方法用于返回选定元素的数组 。但是使用后程序提示 “太多的循环,即可能没有给递归设置停止的条件”
而如果换成splice()方法就没有任何问题 。这点我很疑惑。后来我alert两种方法的返回数,我发现splice()的数值在变,而slice()的一直都是同一个数。这是什么原因呢?
是因为slice()操作的不是原数组吗?
补充:这是隔了一段时间后看到自己写的代码 这个为什么用splice()方法呢 因为这个方法操作原数组,而在用递归的时候数组才能不断被切割,即不断的把问题往结束条件的方向递推,slice()方法是浅拷贝数组进行切割,原数组一直未变,所以程序运行的结果就是爆栈。
每天坚持学习技术,坚持更博

浙公网安备 33010602011771号