`

排序算法:求 长度为 n的 数组中,最大的 m个数

阅读更多

排序:数组 length=m,从其中中取出最大的 n 数字,n<=m

 

 

import java.util.Random;
import java.util.TreeSet;

/** 
 * 排序算法:数组 length=m,从其中中取出最大的 n 数字,n<=m
 * 思路:用 TreeSet 存放结果,可以自动排序,先取前100个放到 TreeSet,然后遍历其余的,如果大于 TreeSet 中最小的,则删除 TreeSet 中最小的值,并将新值放到 TreeSet 中,
 */
public class TopMax {
	/** 
	* 如果数字不在 treeset 里,则加入,并返回 true。 
	* 如果数字在 treeset 里,则不加入,并返回 false。 
	* @param ts 
	* @param newData 
	* @return 
	*/
	private static boolean doTop(TreeSet<Integer> ts, int newData) {
		if (ts.contains(newData)) {
			return false;
		}
		ts.remove(ts.first());
		ts.add(newData);
		return true;
	}

	private static void test(int numberCount, int topNum) {
		System.out.println("Sort begin...");

		long current = System.currentTimeMillis();

		int min = 0;

		int maxNumber = numberCount;
		Random random = new Random();
		random.setSeed(System.currentTimeMillis());
		TreeSet<Integer> ts = new TreeSet<Integer>();

		for (int i = 0; i < topNum; ++i) {
			int newData = random.nextInt(maxNumber);
			ts.add(newData);
		}
		min = ts.first();
		for (int i = topNum; i < numberCount; ++i) {
			int newData = random.nextInt(maxNumber);
			if (newData > min) {
				if (doTop(ts, newData)) {
					min = ts.first();
				}
			}
		}
		System.out.println(numberCount + " top " + topNum + " within " + (System.currentTimeMillis() - current) + " millseconds");
		System.out.println(ts);
		System.out.println("Sort end");
	}

	public static void main(String[] args) {
		test(100000000, 100);
	}
}
 
分享到:
评论

相关推荐

    算法实习:分治算法求n个数的数组中找出第二个最大元素

    本文将探讨如何使用分治策略来解决一个特定的问题——在一个包含n个整数的数组中找到第二大的元素。 #### 分治算法原理 分治(Divide and Conquer)是一种重要的算法设计策略,它通过递归地将一个问题分解成两个或...

    排序算法在不同数组状态下时间复杂度的比较

    但在平均情况下,其时间复杂度为O(n log n),这使其成为实践中非常高效的排序算法。快速排序的空间复杂度为O(log n),由于递归栈的深度。 5. **插入排序**: 插入排序的工作原理类似于我们手动整理扑克牌,逐个将...

    将一个数组的所有元素排序后输出

    今天,我们将讨论如何使用汇编语言实现一个排序算法来对一个数组中的10个整型元素进行排序。 首先,让我们来了解一下排序算法的基本概念。排序算法是指将一组无序的数据按照某种规则进行排列,使得数据呈现出一定的...

    求一个数组中第K个最大值和最小值

    标题中的“求一个数组中第K个最大值和最小值”是一个常见的算法问题,这个问题在计算机科学和编程领域中有着广泛的应用。它涉及到数组处理、排序以及数据查找等基本概念。接下来,我们将深入探讨这个问题的解决方案...

    求一组数组的两个最大值和两个最小值 分治法

    通过上述步骤,我们可以有效地使用分治法来求解数组中的两个最大值和两个最小值。这种方法不仅简洁高效,而且避免了蛮力法可能带来的大量重复计算。此外,这种分治的思想还可以应用于其他许多类似的排序和查找问题中...

    合并两个已经排序的数组为另一个数组算法

    该算法的时间复杂度为O(m+n),其中m和n分别是两个输入数组的长度。这是因为每个元素最多只会被访问一次。 #### 知识点五:应用场景 1. **数据库查询优化**:在数据库系统中,处理大量已排序的数据时可以利用此算法...

    数组中数对差最大

    总的来说,"数组中数对差最大"的问题是一个基础的算法问题,通过双指针或排序+双指针的方法可以有效地解决。它展示了如何利用编程技巧在有限的时间内处理数组数据,对于学习和理解数据结构与算法具有重要意义。

    【源代码】C++算法(五)一维数组去重(复杂度为n且不新开辟空间)

    在本篇【源代码】C++算法中,我们主要探讨的是如何在一维数组中去除重复元素,同时确保算法的时间复杂度为O(n),并且在整个处理过程中不额外开辟新的内存空间。这种问题在实际编程中非常常见,特别是在处理大量数据...

    C经典算法之合并排序法

    - 对这两个数组分别使用快速排序算法进行排序。 - 调用 `mergesort()` 函数将排序后的两个数组合并为一个有序数组 `number3`。 - 输出排序前后的数组。 #### 3. 快速排序函数 `quicksort()` - 使用了快速排序算法来...

    java算法题 : 数组相关问题

    2. 最大子数组和:寻找数组中连续子数组的最大和,Kadane's算法可以在一次遍历中解决,时间复杂度为O(n)。 3. 翻转数组:给定一个数组,反转数组中的元素。可以通过两个指针从两端向中间遍历并交换元素实现。 4. ...

    有两个数组a,b,大小都为n,数组元素的值任意,无序

    具体而言,我们有两个无序的整数数组 `a` 和 `b`,每个数组的长度都是 `n`。我们的任务是通过交换 `a` 和 `b` 中的某些元素,使得 `a` 的所有元素之和与 `b` 的所有元素之和之间的差尽可能小。 ### 二、问题分析 #...

    将两数组合并成一个数组并排序

    假设`A`和`B`的长度分别为`n`和`m`,那么合并这两个数组可以分为以下步骤: 1. 创建一个新的数组`C`,长度为`n + m`,用来存放合并后的结果。 2. 初始化两个指针`pA`和`pB`,分别指向`A`和`B`的首元素。 3. 遍历`C`...

    算法分析作业答案:求最大数与次大数的最优算法

    ### 算法分析作业答案:求最大数与次大数的最优算法 #### 题目背景 在计算机科学领域,特别是在数据处理和算法设计方面,经常需要找到一组数值中的最大值或最小值,甚至是第二大值等。这类问题不仅在编程竞赛中常见...

    数组应用及冒泡排序算法示例学习

    数组的索引通常从0开始,因此,如果我们有一个长度为n的数组,我们可以访问从0到n-1的所有位置。 数组的应用非常多样化,可以用于实现以下场景: 1. **存储数据**:例如,你可以创建一个数组来存储学生的成绩、...

    编写一个函数用来实现对一个整型数组中的10个数升序排列

    在这个函数中,我们首先检查数组是否有效(非null且长度大于1),然后通过两层循环实现冒泡排序。外层循环控制遍历次数,内层循环则负责比较并交换相邻元素。通过不断重复这个过程,数组最终会升序排列。 在实际...

    求数组的逆序数

    在计算机科学和编程领域,"数组的逆序数"是一个重要的概念,特别是在算法分析和排序算法中。逆序数(Inversion Count)是指在数组或序列中,如果一个大于其后面的元素,则这样的对称为逆序对。逆序数就是数组中逆序...

    计算整形数组中第k小的数

    在IT行业的算法领域,计算整形数组中第k小的数是一个经典的编程问题,它涉及到排序、查找等基础知识,是衡量一个程序员基本功的重要指标之一。本文将深入解析这一知识点,包括其背后的算法原理、实现方法以及优化...

    算法:求第k小元素

    首先,取数组的第一个、最后一个和中间元素,找出三个中最小的作为新的枢轴,然后根据枢轴的位置将数组分为三部分:小于枢轴、等于枢轴和大于枢轴。如果k在小于枢轴的区间,就在这个区间重复此过程;如果k在大于枢轴...

    在键盘输入数组长度和元素个数,实现冒泡排序.TXT

    这个c/c++小程序的功能是可以让用户从键盘输入数组长度和元素个数, 实现数组元素从大到小,或者从小到大排序,实现冒泡排序的算法.主要涉及到的c/c++的语法有数组/动态内存分配等语法

    求一个数组最小的两个数的下标

    总的来说,解决"求一个数组最小的两个数的下标"的问题,可以通过简单的线性搜索或者利用更高效的算法如优先队列来实现。在实际应用中,应根据数据规模和性能需求选择合适的方法。在VC6.0这样的集成开发环境中,我们...

Global site tag (gtag.js) - Google Analytics