快排实现查找第k大元素

1. 快排

原理:在数组A[l,r]中任意选取一个元素作为分区点(pivot)。然后遍历该数组,将数组中大于pivot的元素置于其右边,小于pivot的元素置于其左边,pivot放在中间位置p处。此时数组被分为三部分,A[l...p-1],A[p+1...r],A[p]。此时递归的对每个子序列进行相同的操作,直到数组元素只有一个为止。此时数组有序。

Java实现:

    public static void quickSort(int arr[],int left,int right){
        if(left >= right) return ;
        int partition = partition(arr,left,right);
        quickSort(arr,left,partition-1);
        quickSort(arr,partition+1,right);
    }

// 对数组分区
	private static int partition(int arr[], int left, int right) {
        int pivot = arr[right];
        int i = left;
        // 已处理的部分放在i的左边,未处理的放在i的右边
        for (int j = left;j < right;j++){
            if(arr[j] > pivot){
				swap(arr[i],arr[j]);
                i++;
            }
        }
		swap(arr[i],arr[right]);
        return i;
    }

2. 查找第K大元素

原理:根据快排原理,每次选出pivot元素,数组都被分为了三部分,A[l...p-1],A[p],A[p+1...r],如果K=pA[p]即为第k大元素,若k<p,说明第k大元素在左边的部分,此时应该在左边A[l...p-1]中继续查找第k大元素,若k>p,说明第k大元素在右边的部分,此时应该在左边A[p+1...r]中继续查找第k大元素

Java实现:


    public static void quickSort(int arr[],int left,int right,int k){
        int partition = partition(arr,left,right);
        if(partition > k){
            quickSort(arr,left,partition-1,k);
        }else if(partition < k){
            quickSort(arr,partition+1,right,k);
        } else {
            System.out.println(arr[k]);
        }
    }

    public static void getKElem(int arr[],int left,int right,int k){
        quickSort(arr,left,right,k-1);
    }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zhang L.R.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值