js快速排序正确的写法

js快速排序的正确写法


  前端小白一枚,学习js的时间不长,这里想说一说关于快速排序法的代码的正确写法,网上有很多,我只能说有些事不够准确的,没有考虑到数组里面重复出现元素的情况,请看看正确的代码显示

   // 快速排序法
	  function quickSort(array){
		  if(array.length<=1){
			  return array;
		  }
		  var left=[];
		  var right=[];
		  var middleIndex=parseInt(array.length/2);
		  var middle=array[middleIndex];
		  for(var i=0; i<array.length;i++){
			  if(array[i]<middle){
				  left.push(array[i]);
			  }
			  if(array[i]>middle){
				  right.push(array[i])
			  }
			  if(array[i]==middle){
				  continue;
			  }
		  }
		return  quickSort(left).concat(middle,quickSort(left));
		  
	  }
		var a=[1,2,5,1,4,2,55,12,22];
				quickSort(a);
				console.log(a)

为什么说网上很多快速排序法的实例代码都不够准确呢?因为他们忽视了一种情况,就是忽视了遍历元素和中间值相等的情况,可能有人觉得这种情况根本不用考虑,中间值相等的时候放在左边或者右边数组里都可以,咋一看,好像挺有道理的,起初看视频学习时,老师是考虑中间值的,后来觉的老师写考虑中间值是多此一举,于是自己用网上教的方法敲了一遍代码,试了一下,发现了一个死循环,debug了几个小时,硬是没解决,后来用了老师的代码,发现没有问题,综合分析,就是没有考虑中间值的问题,如果数组长度递归到二,那么问题就来了
  什么问题呢?当数组长度为二的时候取中间值然后一分为二,这里就会出现一个数组为空数组,另一个数组的长度为1,由于中间值没有进行判断,所以有可能被push到数组长度为一的那个数组里面,这样就会不断的递归形成死循环,造成内存的溢出!
  这是我的第一篇博客,有不同观点可以指出!

猜你喜欢

转载自blog.csdn.net/weixin_43414945/article/details/88842048