使用快排切分实现快排和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. 团队项目-记账App

    一.团队成员介绍 队长: 向瑜 博客园地址: https://www.cnblogs.com/xiangyu721/  沟通能力较强,善于总结,能够正确分配团队任务.其次,有耐心学习新事物,发现新问题 ...

  2. Python使用Tornado+Redis维护ADSL拨号服务器代理池

    们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以当 ...

  3. Python configparser模块操作代码实例

    1.生成配置文件 ''' 生成配置文件 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知 ...

  4. LinuX操作系统基础------>了解文件结构和相关的文件操作

    了解LinuX文件系统 熟悉LinuX的文件结构 熟悉LinuX的基本操作指令 利用所学指令进行指令组合操作 什么是文件?什么是目录? 文件:一般是一个独立的东西,可以通过某些工具将其打开 目录:可以 ...

  5. CSS基础知识(上)

    1.创建结构化.语义丰富HTML 语义化标记是优秀HTML文档的基础. 语义化标记意味着在正确的地方使用正确的元素,从而得到有意义的文档. 有意义的文档可以确保尽可能多的人都能够使用. 1.1 ID和 ...

  6. XCTF-WEB-新手练习区(5-8)笔记

    5:disabled_button X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢? 删除disable="" 字段 ...

  7. Vue CLI Webpack 创建Vue项目

    简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...

  8. Windows10 + Ubuntu 20.04 LTS 双系统安装 (UEFI + GPT)(图文,多图预警)

    版权声明:本文为CSDN博主「ZChen1996」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/ZChen1 ...

  9. Java继承后访问成员的特点

    继承后的特点--成员变量 对象访问成员变量时,会先在子类中查找有没有定义对应的变量,若子类中存在就会就近使用子类中的变量,若子类中没有定义就会沿着继承关系往上找有没有定义相应的变量,若父类中也没有则编 ...

  10. Mybatis 和 Solon 在一起的升级版

    终于说通 Solon 作者,让他为 Solon 框架添加事务注解支持了:并且把 mybatis-solon-plugin 的 @Df 注解更名为 @Db ,接地气多了(Df是什么鬼呢?新手肯定这么想. ...