java代码快速排序

 

 

1.最简洁版(源自算法导论)

     /**
     * @param a 数组数据
     * @param l 左边界
     * @param r 右边界
     */
    public void quickSort(int[] a, int l, int r) {
        if (l >= r) return;//过滤边界
        int dp = l;//分界点位置(divide point)
        for (int i = l; i < r; i++) {
            if (a[i] < a[r]) { // 以最右的数为基准数pivot
                swap(a, i, dp++);// 所有分界点左边的数都应小于pivoit,如果不小于则放最左边并让分界点向前挪一个
            }
        }
        swap(a, r, dp);// 基准数归位
        quickSort(a, l, dp - 1);
        quickSort(a, dp + 1, r);
    }

    private void swap(int[] a, int s1, int s2) {
        if (s1 == s2) return;
        int temp = a[s1];
        a[s1] = a[s2];
        a[s2] = temp;
    }

 

2。随机优化版

 

public void random_quicksort(int[] a, int left, int right) {
		if (left >= right) { // 先判断边界,要排序的数组长度最少为2
			return;
		}
		// 在排序前,先随机换一下基准值,基准值位置默认为最右边
		Random r = new Random();
		int index = (r.nextInt(right - left)) + left;
		swap(a, index, right);

		int i = left; // 左指针,所指元素 都是已经确定好比基准值小。极端情况基准值选了个最小值,也会与第一个值交换
		int pivot = a[right];// 以最右边的值为基准值
		// 遍历,将比基准值小的数都一次放最左边
		for (int j = left; j < right; j++) {
			if (pivot > a[j]) {
				swap(a, i++, j); // i++ 移动指针
			}
		}
		swap(a, i, right); // 遍历完成后,则确认好了基准值的位置为i,让基准值归位
		quickSort1(a, left, i - 1); // 递归,分治
		quickSort1(a, i + 1, right);
	}
	
	private void swap(int[] a, int i, int j) {  //交换函数
		int temp;
		temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}

 

 

 

3.高效率版(源自快排发明者C.R.Hoare)

 

/**
 * @param a
 *            需要排序的目标数组
 * @param left
 *            左边界
 * @param right
 *            右边界
 */
public void quickSort2(int[] a, int left, int right) {
	// 先判断边界,要排序的数组长度最少为2
	if (left >= right) {
		return;
	}
	// 以左边第一个数为基准值
	int pivot = a[left];
	// 创建左右两个指针
	int i = left, j = right;
	// 跳出循环时i=j,说明找到基准数的位置
	while (i < j) {
		// 因为基准值确定为左边第一个位置,所以要先从右边向左边找比基准值小的数,跳出循环有两种情况,1 :找到了这个数,2: i=j
		while (a[j] >= pivot && i < j) {
			j--;
		}
		// 再从左边找
		while (a[i] <= pivot && i < j) {
			i++;
		}
		if (i < j) {
			// 交换位置
			swap(a, i, j);
		}
	}
	// 跳出循环说明i=j,指针碰到一起,也就确定好了基准值的位置,让基准值归位
	swap(a, i, left);
	// 递归调用,分治
	quickSort2(a, left, i - 1);
	quickSort2(a, i + 1, right);
}
public void swap(int[] a,int i,int j){
    a[i]=a[i]+a[j];
    a[j]=a[i]-a[j];
    a[i]=a[i]-a[j];
}

/***********不用交换函数实现,但是原理一样*****************/
public void quickSort4(int[] a,int left,int right){
	if(left>=right){
		return;
	}
	int i=left,j=right;
	int pivot=a[left];
	while(i=pivot&&i=pivot&&i

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值