快速排序


快速排序的思路是:在数组中找到一个元素,保证这个个元素的左边都小于这个元素,右边大于这个元素,这个操作称为切分,那个元素称为“切分元素”。

每次切分数组,保证“切分元素“”右边的元素总是大于“切分元素”,“切分元素”左边的元素总是小于“切分元素”。那么,这个“切分元素”的最终位置便确定了,在其左右的两个子数组的切分过程中,它不再参与。(但是不能保证切分元素在数组的中央位置)

public static void quickSort(int[] a) {
	sort(a, 0, a.length - 1);
}

public static void sort(int[] a, int lo, int hi) {
	if (lo >= hi) return;
	int mid = partition(a, lo, hi);	//切分函数,确定了mid的最终位置
	sort(a, lo, mid - 1);	//递归切分左子数组
	sort(a, mid + 1, hi);	//递归切分右子数组
}

public static void partition(int[] a, int lo, int hi) {
	int i = lo, j = hi + 1;
	int v = a[lo];	//将第一个元素定为切分元素
	
	while (true) {
		while (a[i++] < v) if (i == hi) break;	//i最终会定位到hi或右子数组的最左位置
		while (a[j--] > v) if (j == lo) break;	//j最终会定位到lo或左子数组的最右位置
		if (i >= j) break;
		exch(a, i, j);
	}
	exch(a, lo, j);	//将切分元素与小于它的左子数组的最右交换位置
	return j;
}



另外,如果使用辅助数组很容易实现切分,但将切分后的数组复制回去的开销也许会得不偿失,大大降低排序的速度。所以请原地切分。


参考《算法》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值