使用快排切分实现快排和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();
}
}

输出结果

Array_1: 48 12 6 8 11
GetTopK: 6 8
Array_2: 25 14 45 8 10
Sorted: 8 10 14 25 45

记录一个基于Java的利用快排切分来实现快排TopK问题的代码模板的更多相关文章

  1. 开心一下-实现一个基于Java的中文编程语言2

    https://mp.weixin.qq.com/s/VmCTvh0c7X9DjIgIMycdlw   上一篇所提到的只是使用中文写Java,而不能算作一门新的语言.作为一门中文语言,需要语言提供的关 ...

  2. TTMS 一个基于Java Swing的Socket通信的剧院票务管理系统

    TTMS (Theater Ticket Management System) 点我进入github TTMS全称剧院票务管理系统,分为客户端和服务器端.服务器端可以接收客户端连接请求,客户端相当于我 ...

  3. Lucene:基于Java的全文检索引擎简介

    Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...

  4. Lucene:基于Java的全文检索引擎简介 (zhuan)

    http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Ja ...

  5. 基于Java实现简单亚马逊爬虫

    前言:最近博主买了台Kindle,感觉亚马逊上的图书资源质量挺好,还时不时地会有价格低但质量高的书出售,但限于亚马逊并没有很好的优惠提醒功能,自己天天盯着又很累.于是,我自己写了一个基于Java的亚马 ...

  6. 基于Java使用Snmp4j进行监控与采集(snmptrap、snmpwalk、snmpget)

    之前有在弄监控服务器这块的工作,今天来整体总结下.因为有些服务器(路由器.交换机等都是基于snmp协议的)必须使用snmp协议去监控采集和接收信息,所以必须去了解snmp相关内容,以及如何在基于jav ...

  7. 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)

    原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平 ...

  8. 基于Java在线学习系统设计与实现

                 Spring+SpringMVC+MyBatis+Bootstrap+Vue开发在线学习系统 本课题的主要内容是开发基于Java EE的在线学习平台,使用MVC经典开发模式. ...

  9. 基于Java的Http服务器几种模式演进

    首先抛出问题: 程序1---错误版本 import java.io.IOException; import java.io.InputStream; import java.io.PrintWrite ...

随机推荐

  1. 009_go语言中的slices分片

    代码演示 package main import "fmt" func main() { s := make([]string, 3) fmt.Println("emp: ...

  2. 安装Scrapy过程中遇到的几个问题总结

    安装Scrapy 1.https://www.lfd.uci.edu/~gohlke/pythonlibs/下载 Twisted 安装 Twisted-19.10.0-cp37-cp37m-win_a ...

  3. Java基础—字符串

    事实上,Java是没有内置的字符串类型的,而是在标准Java类库中提供了一个预定义类String.每个用双引号括起来的字符串都是String类的一个实例: String str = "&qu ...

  4. RF,SVM和NN的优缺点

    1. 随机森林优缺点 随机森林(RF)是Bagging的一个扩展变体.RF在以决策树为基分类器进行集成的基础上,进一步在决策树的训练过程中引入了随机属性选择. Bagging就是对数据集训练多个基分类 ...

  5. C#LeetCode刷题之#21-合并两个有序链表(Merge Two Sorted Lists)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3818 访问. 将两个有序链表合并为一个新的有序链表并返回.新链表 ...

  6. LeetCode343 整数拆分详解

    题目详情 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1 ...

  7. hdfs学习(三)

    HDFS 的 API 操作 使用url方式访问数据(了解) @Test public void urlHdfs() throws IOException { //1.注册url URL.setURLS ...

  8. Spring Boot系列(二):Spring Boot自动装配原理解析

    一.Spring Boot整合第三方组件(Redis为例) 1.加依赖 <!--redis--> <dependency> <groupId>org.springf ...

  9. dotnet cli

    前言 dotnet cli (Command-Line Interface) .net 源代码和二进制文件管理工具.需要安装 .NET Core SDK. 终端执行 dotnet --info 可以打 ...

  10. SpringBoot集成Junit

    1.在pom.xml下添加Junit依赖: <!--添加junit环境的jar包--> <dependency> <groupId>org.springframew ...