【排序】快速排序

快速排序

    快速排序和冒泡排序都是是交换排序中的一种。

基本思想

    1,在数列中找准一个基准点pivot
    2,将比基准点小的所有值放在基准点的左边,将比基准点大的放在基准点的右边【相等的可以任意放置】。
    3,对左边的子数列和右边的子数列,重复1到3的步骤。分而治之,是的递归来了。

代码

	var sort = (arr, low, high) => {
	  if (!arr || arr.length === 1) return arr
	  // 重要的边界条件
	  if (low > high) return  
	  let pivotKeyIndex = getPartitionIndex(arr, low, high)
	  sort(arr, low, pivotKeyIndex - 1)
	  sort(arr, pivotKeyIndex + 1, high)
	  return arr
	}
	
	var getPartitionIndex = (arr, low, high) => {
	  let key = arr[low]
	  while(low < high) {
	    // high开始的已经大于key,不需要移动,只需要继续往前
	    while ( arr[high] >= key && low < high) high--
	    arr[low] = arr[high]  
	    // low处的值已经小于key,不需要移动,只需要继续往后
	    while (arr[low] < key && low < high)  low++
		arr[high] = arr[low]
	  }
	  // pivotKey放到中间index,此时左边全是比pivotKey小,右边比他大
	  arr[low] = key
	  return low
	}
	console.log(sort([5,2,4,6,1,3], 0, 5))
	console.log(sort([9,8,6,10,2,7,20], 0, 6))
	console.log(sort([9,8,6,10,2,7,20,2], 0, 7)) // 重复的情况

getPartitionIndex方法可以改进一下

var getPartitionIndex = (arr, low, high) => {
  let key = arr[low]
  while(low < high) {
    // high开始的已经大于key,不需要移动,只需要继续往前
    while ( arr[high] >= key && low < high) high--

    // method 1
    // arr[low] = arr[high]  
    
    // method 2
    if (low < high) {
      arr[low] = arr[high]
      low++
    }

    // method wrong
    // if (arr[high] < key) { 
      // low++
    // }
    // low处的值已经小于key,不需要移动,只需要继续往后
    while (arr[low] < key && low < high)  low++

    // method 1
    // arr[high] = arr[low]

    // method 2
    if (low < high) {
      arr[high] = arr[low]
      high--
    }

    // method wrong
    // if (arr[low] > key) {
      // high--
      // console.log(arr, '>')
    // }
  }
  arr[low] = key
  return low
}


资料: 王卓老师-快速排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值