【21天学习挑战赛】算法——快速排序

活动地址:CSDN21天学习挑战赛

快速排序思想

快速排序最重要的思想是分而治之。
在一堆需要排序的数字中,取出任意一个数字m,将所有小于m的数字放在这个数字左边,所有大于m的数字放在右边。然后在分别对左边和右边的数字继续以上的操作,最后就可以得到有序的序列。

枢纽的选择

枢纽是把数据分为两部分的数字。
第一一种方案是直接选择第一个元素作为枢纽,但第一个作为枢纽在某些情况下,效率并不是特别高。
第二种方案是使用随机数,但是随机数本身就是一个耗性能的操作
第三种方案是取头、中、尾的中位数

function swap(arr, left,right){
	let temp = arr[right];
	arr[right] = arr[left];
	arr[left] = temp;
}
function media(arr, left, right){
	// 取出中间的位置
	let center = Math.floor((left + right) / 2);
	//判断大小并进行交换
	if(arr[left] > arr[center]){
		swap(arr, left, center);
	} 
	if(arr[center] > arr[right]){
		swap(arr, center, right);
	}
	if(arr[left] > arr[right]){
		swap(arr, left, right);
	}
	// 经过前面一系列的判断后center指向的元素一定比最后一个小,在后面的判断中最后一个元素不会再变动。
	swap(center, right-1);
	return arr[right - 1];
}

快速排序代码

function quickSort(arr, ){
  quick(0, arr.length - 1);
}

function quick(arr, left,right){
  if(left >= right){
    return ;
  }
  // 获取枢纽
  let privot = media(arr, left, right);
  let i = left;
  let j = right;
  while(true){
    while (arr[++i] < privot){
      
    }
    while(arr[--j] > privot){
      if(i < j){
        swap(i, j);
      } else {
        break;
      }
    }
  }
  // 把枢纽放置在正确的位置, 即i的位置
  swap(i, right - 1);

  // 分而治之
  quick(left, i - 1);
  quick(i+1, right);
}

下面使用的是把第一个元素作为枢纽的方式。
在列表中选择一个元素作为基准值,将小于基准值的元素排在数组的左边,将大于基准值的元素排在数组的左边。再分别对左边和右边的数据进行分割。

function quickSort(arr){
	if (arr.length === 0 ) return [];
	let left = [];
	let right = [];
	let privot = arr[0];
	for(let i = 1; i< arr.length; i++){
		if(arr[i] < privot){
			left.push(arr[i]);	
		} else {
			right.push(arr[i]);
		}
	}
	return quickSort(left).concat(privot,quickSort(right));
}

快速排序复杂度分析

时间复杂度

在最坏情况下,即每次选择的枢纽是最左边或最后边的数据。这种情况下效率等同于冒泡排序。
平均效率是O(n*logn)

空间复杂度

快速排序使用变量存储元素的索引,属于常数级别的复杂度即O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端御书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值