快速排序和快速选择(quickSort and quickSelect)算法

排序算法:快速排序(quicksort)递归与非递归算法
TopK问题:快速选择(quickSelect)算法

import java.util.*;
import java.lang.*;public class Demo {// 非递归 using stackpublic static void quickSortStack(int[] nums, int left, int right) {if (left >= right) return;Stack<Range> stack = new Stack<Range>();stack.push( new Range(left, right) );while( !stack.empty() ) {Range curRange = stack.pop();if (curRange.left < curRange.right) {int pivotIdx = partition(nums, curRange.left, curRange.right);stack.push( new Range(curRange.left, pivotIdx - 1) );stack.push( new Range(pivotIdx + 1, curRange.right) );}}}// recursion quickSortpublic static void quickSort(int[] nums, int left, int right) {if (left < right) {int pIdx = partition(nums, left, right);quickSort(nums, left, pIdx - 1);quickSort(nums, pIdx + 1, right);} }public static int partition(int[] nums, int left, int right) {// nums[left]~nums[retIdx - 1] <= nums[retIdx] <= nums[retIdx ~ right]if (left == right) return left;int pivot = nums[left]; // mark the leftmost value as the pivot. and store it.int lp = left, rp = right;while(lp < rp) {while(lp < rp && nums[rp] >= pivot)rp--;nums[lp] = nums[rp]; //move the smaller value to left Range.while(lp < rp && nums[lp] <= pivot)lp++;nums[rp] = nums[lp]; // move the bigger value to right Range.}nums[lp] = pivot;return lp;}public static void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}public static int partitionV2(int[] nums, int left, int right) {int l = left;int r = right + 1;int pivot = nums[left];while(true) {while( l < right && nums[++l] < pivot )if ( l == right ) break;while( r > left && nums[--r] >= pivot )if ( r == left ) break;if (l >= r)break;swap(nums, l, r);}swap(nums, left, r);return r;}//TopK问题public static int findKthLargest(int[] nums, int k) {return quickSelect(nums, k, 0, nums.length - 1);}//快速选择算法public static int quickSelect(int[] nums, int k, int left, int right) {if (left == right) return nums[left];int index = partition(nums, left, right);if ( index - left + 1 == k) {return nums[index];}else if ( index - left + 1 > k ) {return quickSelect(nums, k, left, index - 1);}else {return quickSelect(nums, k - index + left - 1, index + 1, right);}}public static void showArrays(int[] nums, String str) {System.out.println("===" + str + "===");showArrays(nums);}public static void showArrays(int[] nums) {for (int i = 0; i < nums.length; i++)System.out.printf(nums[i] + " ");System.out.println();}public static void main(String[] args) {int[] nums = new int[] {1,3,2,3,4,2,7,5};// int[] nums = new int[]{3,2,3};showArrays(nums, "origin");//print i-th min nubmer.for (int i = 1; i <= nums.length; i++) {System.out.println( i + " " + findKthLargest(nums, i) );}quickSortStack(nums, 0, nums.length - 1);showArrays(nums, "quickSortStack");}
}class Range {public int left;public int right;public Range(int left, int right) {this.left = left;this.right = right;}
}

转载于:https://www.cnblogs.com/johnleo/p/quicksort_and_quickselect.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序点击地图气泡获取气泡_气泡上的气泡

小程序点击地图气泡获取气泡Combining two colors that are two steps apart on the Color Wheel creates a Diad Color Harmony. This Color Harmony is one of the lesser used ones. I decided to cover it here to add variety to your options for colorizing visualizati…

leetcode 150. 逆波兰表达式求值(栈)

根据 逆波兰表示法&#xff0c;求表达式的值。 有效的算符包括 、-、*、/ 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说&#xff0c;表达式总会得出有效数值且不存在…

WebLogic常见问题

myeclipseweblogic10的配置&#xff0c;配置成功 运行中可能失败&#xff0c;由于weblogic10不稳定&#xff0c;重启机器后可以使用了 web工程使用到hibernate3时可能出现问题 ClassNotFoundException: org.hibernate.hql.ast.HqlToken 参考http://blog.chinajavaworld.com/ent…

PopTheBubble —测量媒体偏差的产品创意

产品管理 (Product Management) A couple of months ago, I decided to try something new. The MVP Lab by Mozilla is an 8-week incubator for pre-startup teams to explore product concepts and, over the 8 weeks of the program, ship a minimum viable product that p…

linux-Centos7安装nginx

首先配置linux环境&#xff0c;我这里是刚刚装好linux&#xff0c;所以一次性安装了一系列我需要到的环境&#xff1b; yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel e…

javascript原型_JavaScript原型初学者指南

javascript原型You cant get very far in JavaScript without dealing with objects. Theyre foundational to almost every aspect of the JavaScript programming language. In fact, learning how to create objects is probably one of the first things you studied when …

leetcode 73. 矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 进阶&#xff1a; 一个直观的解决方案是使用 O(mn) 的额外空间&#xff0c;但这并不是一个好的解决方案。 一个简单的改进方案是使用 O(m n) 的额…

elasticsearch,elasticsearch-service安装

在Windows上安装Elasticsearch.zip 1 安装条件 安装需具备java 8或更高版本&#xff1b;官方的Oracle发行版&#xff0c;只需安装JDKElasticsearch的ZIP安装包——安装包地址 2 如何安装 Elasticsearch 傻瓜式的点下一步即可&#xff0c; java 注意环境变量配置 3 如何判断安装…

图表可视化seaborn风格和调色盘

seaborn是基于matplotlib的python数据可视化库&#xff0c;提供更高层次的API封装&#xff0c;包括一些高级图表可视化等工具。 使用seaborn需要先安装改模块pip3 install seaborn 。 一、风格style 包括set() / set_style() / axes_style() / despine() / set_context() 创建正…

面向Tableau开发人员的Python简要介绍(第3部分)

用PYTHON探索数据 (EXPLORING DATA WITH PYTHON) One of Tableau’s biggest advantages is how it lets you swim around in your data. You don’t always need a fine-tuned dashboard to find meaningful insights, so even someone with quite a basic understanding of T…

leetcode 191. 位1的个数(位运算)

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xf…

7、芯片发展

第一台继电器式计算机由康德拉.楚泽制造&#xff08;1910-1995&#xff09;&#xff0c;这台机器使用了二进制数&#xff0c;但早期版本中使用的是机械存储器而非继电器&#xff0c;使用老式35毫米电影胶片进行穿孔编程。 同一时期&#xff0c;哈佛大学研究生霍华德.艾肯 要寻找…

seaborn分布数据可视化:直方图|密度图|散点图

系统自带的数据表格&#xff08;存放在github上https://github.com/mwaskom/seaborn-data&#xff09;&#xff0c;使用时通过sns.load_dataset(表名称)即可&#xff0c;结果为一个DataFrame。 print(sns.get_dataset_names()) #获取所有数据表名称 # [anscombe, attention, …

如何成为一个优秀的程序员_如何成为一名优秀的程序员

如何成为一个优秀的程序员by Amy M Haddad通过艾米M哈达德(Amy M Haddad) 如何成为一名优秀的程序员 (How to be a great programmer) What sets apart the really great programmers?是什么使真正出色的程序员与众不同&#xff1f; As we all know, great programmers buil…

pymc3使用_使用PyMC3了解飞机事故趋势

pymc3使用Visually exploring historic airline accidents, applying frequentist interpretations and validating changing trends with PyMC3.使用PyMC3直观地浏览历史性航空事故&#xff0c;应用常识性解释并验证变化趋势。 前言 (Preface) On the 7th of August this yea…

视频监控业务上云方案解析

摘要&#xff1a;阿里云针对安防监控服务在传统IT架构下面临的上述问题&#xff0c;基于阿里云存储服务&#xff0c;提供视频监控解决方案。从2015年推出视频监控存储与播放解决方案以来&#xff0c;帮助大量的视频监控企业解决了上云的过程中遇到的问题&#xff0c;针对不同的…

leetcode 341. 扁平化嵌套列表迭代器(dfs)

给你一个嵌套的整型列表。请你设计一个迭代器&#xff0c;使其能够遍历这个整型列表中的所有整数。 列表中的每一项或者为一个整数&#xff0c;或者是另一个列表。其中列表的元素也可能是整数或是其他列表。 示例 1: 输入: [[1,1],2,[1,1]] 输出: [1,1,2,1,1] 解释: 通过重复…

爬虫结果数据完整性校验

数据完整性分为三个方面&#xff1a; 1、域完整性&#xff08;列&#xff09; 限制输入数据的类型&#xff0c;及范围&#xff0c;或者格式&#xff0c;如性别字段必须是“男”或者“女”&#xff0c;不允许其他数据插入&#xff0c;成绩字段只能是0-100的整型数据&#xff0c;…

go map数据结构

map数据结构 key-value的数据结构&#xff0c;又叫字典或关联数组 声明&#xff1a;var map1 map[keytype]valuetype var a map[string]string var a map[string]int var a map[int]string var a map[string]map[string]string备注&#xff1a;声明是不会分配内存的&#xff0c…

吴恩达神经网络1-2-2_图神经网络进行药物发现-第2部分

吴恩达神经网络1-2-2预测毒性 (Predicting Toxicity) 相关资料 (Related Material) Jupyter Notebook for the article Jupyter Notebook的文章 Drug Discovery with Graph Neural Networks — part 1 图神经网络进行药物发现-第1部分 Introduction to Cheminformatics 化学信息…