java gettop函数_记录一个基于Java的利用快排切分来实现快排TopK问题的代码模板...

import java.util.Arrays;

public class TestDemo {

public static void main(String[] args) {

int[] arr1 = {48, 12, 6 ,8, 11};

int[] arr2 = {25, 14, 45 ,8, 10};

int k = 2;

System.out.print("Array_1: ");

printArr(arr1);

System.out.print("GetTopK: ");

// 注意是k-1

int[] topK = getTopK(arr1, 0, arr1.length - 1, k - 1);

printArr(topK);

System.out.print("Array_2: ");

printArr(arr2);

quickSort(arr2, 0, arr2.length - 1);

System.out.print("Sorted: ");

printArr(arr2);

}

/**

* 快速排序

* @param arr 数组

* @param l 左边界

* @param r 右边界

*/

private static void quickSort(int[] arr, int l, int r) {

if (l >= r) return;

int index = partition(arr, l, r);

quickSort(arr, l, index - 1);

quickSort(arr, index + 1, r);

}

/**

* 快排切分寻找TopK

* @param arr 数组

* @param l 左边界

* @param r 右边界

* @param k TopK

* @return TopK数组

*/

private static int[] getTopK(int[] arr, int l, int r, int k) {

// 每快排切分1次,找到排序后下标为j的元素,如果j恰好等于k就返回j以及j左边所有的数

int j = partition(arr, l, r);

if (j == k) return Arrays.copyOf(arr, j + 1);

// 否则根据下标j与k的大小关系来决定继续切分左段还是右段

return j > k ? getTopK(arr, l, j - 1, k) : getTopK(arr, j + 1, r, k);

}

/**

* 快排切分

* 返回下标j,使得比arr[j]小的数都在j的左边,比arr[j]大的数都在j的右边

* @param arr 数组

* @param l 左边界

* @param r 右边界

* @return 一次切分后的基准值下标j

*/

private static int partition(int[] arr, int l, int r) {

int i = l, j = r + 1, pivot = arr[l];

while (true) {

while (++i <= r && arr[i] < pivot);

while (--j >= l && arr[j] > pivot);

if (i >= j) break;

swap(arr, i, j);

}

swap(arr, l, j);

return j;

}

/**

* 数组下标对应值交换函数

* @param arr 数组

* @param i 下标i

* @param j 下标j

*/

private static void swap(int[] arr, int i, int j) {

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

/**

* 打印数组

* @param arr 数组

*/

private static void printArr(int[] arr) {

for (int i : arr) {

System.out.print(i + " ");

}

System.out.println();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值