算法——快速排序(Quicksort)

快速排序的思路:

(1)在数据集中,选择一个元素作为“基准(pivot)”。(基准值可以任意选择,但是选择中间的值比较容易理解)

(2)所有小于“基准”的元素,都移到“基准”的左边,所有大于“基准”的元素,都移到“基准”的右边。

(3)对“基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

快速排序的时间复杂度和空间复杂度:

(1)最优情况下的时间复杂度为O(nlogn);最差情况下的时间复杂度为O(n^2);平均时间复杂度为O(nlogn)。

(2)最优情况下的空间复杂度为O(logn);最差情况下的空间复杂度为O(n)。


实现代码:

function quickSort(arr){
    if(arr.length <=1){return arr;} 
	var pivotIndex=Math.floor(arr.length/2); //将原数组的中间值作为“基准”,获取其索引值
	var pivot=arr.splice(pivotIndex,1)[0]; //从原数组中删除选定的“基准”元素,并将其赋给pivot
	var leftArr=[];
	var rightArr=[];
	for(var i=0;i<arr.length;i++){
		if(arr[i]<pivot){
			leftArr.push(arr[i]);
		}else{
			rightArr.push(arr[i]);
		}
	}
	return quickSort(leftArr).concat([pivot],quickSort(rightArr)); //分别对左右子集进行快排,并使用concat()数组方法将其合并为一个数组,切勿忘了补上“基准”元素
}
测试结果:


附:

(1)内建对象Math的方法:Math.floor(num)取小于或等于指定值num的最大整数。

(2)数组方法arr.splice(start,count,item1,item2,...):在数组中删除或插入元素的方法,前两个参数指定了需要删除从下标为start开始的count个元素,之后的参数从下标为start开始插入。(会改变原数组)

(3)数组方法arr.concat():合并产生一个新数组,参数可取多个,类型不限于数组,也可为数字,字符串等。(不改变原数组)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值