使用快排切分实现快排和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. Java语言特性

    Java的语言特性: 1.语法相对简单 2.面向对象 3.分布性 4.可移植性 5.安全性 6.健壮性 7.解释性 8.多线程 9.动态性与并发性 Java中的面向对象编程: 面向对象程序设计(Obj ...

  2. 002_go语言的值类型

    代码演示: package main import "fmt" func main() { fmt.Println("go"+"lang") ...

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

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

  4. 学长小清新题表之UOJ 14.DZY Loves Graph

    学长小清新题表之UOJ 14.DZY Loves Graph 题目描述 \(DZY\)开始有 \(n\) 个点,现在他对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 ...

  5. Oracle数据库安装教程

    一.准备文件 Oracle安装程序(64位)下载地址: http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_database_ ...

  6. python 用 prettytable 输出漂亮的表格

    原文链接:https://linuxops.org/blog/python/prettytable.html #!/usr/bin/python #**coding:utf-** import sys ...

  7. cpu相关信息(进程、线程、核...)

    cpu的相关信息. 1.cpu 1.1 物理cpu 实际Server中插槽上的CPU个数.物理cpu数量,可以数不重复的 physical id 有几个 1.1.1 查看物理CPU的个数 cat /p ...

  8. 更换git远程仓库地址

    通过命令直接修改远程仓库地址 git remote 查看所有远程仓库 git remote xxx 查看指定远程仓库地址 git remote set-url origin 你新的远程仓库地址 先删除 ...

  9. MapReduce 的 shuffle 过程中经历了几次 sort ?

    shuffle 是从map产生输出到reduce的消化输入的整个过程. 排序贯穿于Map任务和Reduce任务,是MapReduce非常重要的一环,排序操作属于MapReduce计算框架的默认行为,不 ...

  10. Windows Server 2012 数据库定时备份

    为了数据的安全,我们在服务器上设置了每周备份一次,下面是具体步骤: 一.在文件客户端服务器创建db_backup.cmd的Windows命令脚本.输入以下内容(直接复制可能出错,请手动输入): @ec ...