`

合并多个有序数组

阅读更多
package org.jyjiao;

class HeapItem{
	private int arrayIndex;
	private int data;
	private int curIndex;
	
	public HeapItem(int arrayIndex,int data){
		this.arrayIndex=arrayIndex;
		this.data=data;
	}
	public int getArrayIndex(){
		return this.arrayIndex;
	}
	public int getData(){
		return this.data;
	}
	public void setArrayIndex(int index){
		this.arrayIndex=index;
	}
	public void setData(int data){
		this.data=data;
	}
	public int getCurIndex() {
		return curIndex;
	}
	public void setCurIndex(int curIndex) {
		this.curIndex = curIndex;
	}

}

class Heap{
	int count=0;
	HeapItem[] items;
	int[] arrayCurIndex;
	
	//建立规模为m的堆数组,m为顺序数组的个数
	public Heap(int m){
		items=new HeapItem[m];
		arrayCurIndex=new int[m];
	}
	
	//删除堆顶元素
	public HeapItem delTop(){
		arrayCurIndex[items[0].getArrayIndex()]+=1;
		return items[0];
	}
	
	//获得某个数组下一个要出队的元素下标
	public  int getCurIndex(int arrayIndex){
		return arrayCurIndex[arrayIndex];
	}
	
	public HeapItem getNextItem(int i){
		return items[i+1];
	}
	
	//利用所有数组的第一个元素建堆
	public void createHeap(int[] firArray){
		for(int i=0;i<firArray.length;i++){
			items[i]=new HeapItem(i,firArray[i]);   //注意这里:对象数组的元素使用之前必须new该元素
		}
		for(int i=firArray.length/2-1;i>=0;i--){
			siftDown(i);
		}
		
	}
	/*向上筛
	void siftUp(int i){
		
	}
	*/
	//建堆后插入一个新元素到堆顶
	public void insert(int i,int data){
		HeapItem item=new HeapItem(i,data);
		int ret=items[0].getArrayIndex();
		items[0]=item;
		siftDown(0);
	}
	
	//向下筛
	void siftDown(int i){
		int j=2*i+1;
		if(items.length>1){
			HeapItem tmp=items[i];
			while(j<items.length){
				
				if((j<(items.length-1))&&(items[j].getData()<items[j+1].getData())){
					j++;
				}
				if(items[j].getData()>tmp.getData()){
				    items[i]=items[j];
				    i=j;
					j=2*j+1;
				}else{
					break;
				}
			}
			items[i]=tmp;
		}	
	}
	
}

public class MutiMaxK {
	
	public void getMaxK(int[][] array,int K){
		int m=array.length;
		HeapItem[] retArray=new HeapItem[K];
		int count=0;
		
		/*算法步骤:
		 * 1. 对每个有序数组的首元素建最大堆,最大堆的元素为【data,arrayIndex】
		 * 2. 将堆顶元素放入结果数组中,如果该数组的个数==K个,则停止;否则,取出堆顶元素所在的数组中的下一个元素放在堆顶,然后siftdown
		 * 3. 打印结果
		 */
		
		//创建初始堆
		Heap heap=new Heap(m);
		int[] firArray=new int[m];
		for(int i=0;i<m;i++){
			firArray[i]=array[i][0];
		}
		heap.createHeap(firArray);
		HeapItem[] MaxK=new HeapItem[K];
		
		//取出下一元素放入堆中
		while(count<K){
			MaxK[count]=heap.delTop();
			int nextIndex=MaxK[count].getArrayIndex();
			int curIndex=heap.getCurIndex(nextIndex);
			int top=0;
			while(curIndex>(array[nextIndex].length-1)){
				HeapItem hitem=heap.getNextItem(top);
				nextIndex=hitem.getArrayIndex();
				curIndex=heap.getCurIndex(nextIndex);
				top=top+1;
			}
			int data=array[nextIndex][curIndex];
			heap.insert(nextIndex, data);
			count++;
		}
		
		//打印结果
		for(int j=0;j<K;j++){
			System.out.println("第"+(j+1)+"大="+MaxK[j].getData()+" 来自第"+MaxK[j].getArrayIndex()+"队列");
		}
		
	}
	
	public static void main(String[] args){
		int[][]array={{9,7,5,3,1},{10,8,6,4,2},{11,9,7,5,3},{19,12,11,10,8,6},{20,9,7,5,2,1}};
		MutiMaxK m=new MutiMaxK();
		m.getMaxK(array,2);
	}
	
	
}

 

分享到:
评论

相关推荐

    将两个有序数组,合并成另一个有序的数组,升序

    在计算机科学和编程领域中,将两个有序数组合并成另一个有序数组是一个经典的算法问题。这个问题不仅在理论学习中占有重要地位,而且在实际应用中也非常普遍。对于这个任务,核心目标是将两个已经按照升序排列的整数...

    c语言编程题之数组操作合并两个有序数组.zip

    要合并两个有序数组,我们可以采用一种称为“归并”(Merge)的策略。这个方法的核心思想是从两个数组的起始位置开始,比较两个数组的当前元素,将较小的元素放入结果数组,并移动较小元素所在数组的指针。重复此...

    vb 有序数组的合并

    首先,我们创建了两个有序数组 `a` 和 `b`。`a` 包含数字 1 到 11,而 `b` 包含数字 2 到 18。在VB.NET中,数组可以是固定大小的,也可以是动态的(如本例所示的可变类型数组)。为了确定数组的边界,我们可以使用 `...

    C++实现两个有序数组的合并

    C++实现两个有序数组的合并 在本篇文章中,我们将详细介绍如何使用C++语言实现两个有序数组的合并。数组合并是数据结构和算法中的一种常见操作,掌握数组合并的技巧对于提高编程技能非常重要。 数组合并的概念 数...

    java-leetcode面试题解双指针之第88题合并两个有序数组.zip

    本压缩包文件聚焦于一个特定的LeetCode面试题目——第88题“合并两个有序数组”。这个题目是关于数据结构和算法的,特别是涉及到了双指针技术,这是在优化遍历和合并操作时常用的一种策略。现在,我们将深入探讨这个...

    Python3合并两个有序数组代码实例

    在Python3中,合并两个有序数组是一个常见的编程问题,它涉及到高效的算法设计。在这个问题中,我们有两个已排序的数组`a`和`b`,目标是创建一个新的有序数组,包含`a`和`b`的所有元素。有两种常见的解决方法,一种...

    PHP实现合并两个有序数组的方法分析

    在PHP编程中,合并两个有序数组是一个常见的任务,特别是在处理数据排序或算法实现时。本文主要探讨了两种方法来合并两个已排序的数组,并确保合并后的数组仍然有序。此外,还将介绍如何在合并过程中去除重复元素。 ...

    java 数组的合并

    当我们需要将两个或多个数组合并成一个大的数组时,就需要用到数组的合并技术。本篇文章将详细探讨Java中如何实现数组的合并。 首先,我们要了解Java中的数组。数组是由相同类型的数据元素构成的有序集合,可以通过...

    合并数组并且转为有序去重集合

    合并数组并且转为有序去重集合,我看到很多资源博客,百度都弄的很繁琐,所以自己总结描述了一下

    合并有序数组的实现(java与C语言)

    合并有序数组是计算机科学中的一种基本操作,它可以将两个已经排序的数组合并成一个有序数组。合并有序数组的实现有很多种方法,本文主要介绍了Java和C语言的实现方法。 Java版本的实现 ---------------- 在Java中...

    js代码-合并二维有序数组成一维有序数组

    在JavaScript编程中,有序数组是数据处理中常见的一种数据结构,尤其在算法和数据结构的实践中,合并二维有序数组成一维有序数组是一项基础且重要的任务。这有助于优化存储空间和提高查找效率。本篇文章将深入探讨这...

    java实现把两个有序数组合并到一个数组的实例

    这个例子展示了如何在Java中有效地合并两个有序数组,通过这种方式,我们可以构建更复杂的排序算法,如归并排序,或者在处理多个有序数据源时保持数据的有序性。理解并掌握这种技巧对于Java开发者来说是十分重要的,...

    js代码-(算法)合并两个有序数组

    在JavaScript编程中,合并两个有序数组是一个常见的算法问题,它涉及到数组操作和排序。这个问题的主要目标是将两个已经按升序排列的数组合并为一个新的有序数组。以下是对这个主题的详细探讨。 首先,我们需要理解...

    VB 数组做参数合并排序

    在VB(Visual Basic)编程中,数组是一种存储多个相同类型数据的数据结构,它允许程序员以高效的方式处理一组数据。在实际编程中,我们经常需要对数组进行操作,比如排序,这是数据分析、数据处理等任务的基础步骤。...

    matlab开发-多维数组的合并排序

    多维数组可以看作是由多个行和列组成的矩阵的集合,每个矩阵可以在第三维度上堆叠,形成一个三维数组,甚至可以扩展到更多维度。这种数据结构非常适合处理高维数据,如图像、音频信号等。 合并排序在MATLAB中的实现...

    js代码-2.2 双指针法 合并两个有序数组

    在这种情况下,我们有两个指针,分别称为`i`和`j`,分别指向两个有序数组`arr1`和`arr2`的起始位置。我们比较`arr1[i]`和`arr2[j]`的值,将较小的那个元素添加到结果数组,并相应地更新对应指针。当一个数组的所有...

    合并两个有序顺序表

    在计算机科学中,排序是数据处理的一个重要...在实际编程中,这种算法常用于处理分治策略的归并排序,以及在数据库和文件系统等场景中合并多个有序数据流。理解和掌握这个算法对于提升编程技能和解决实际问题至关重要。

    两个有序数组合并为一个数组.java.doc

    在本资源中,我们使用 Java 语言实现了两个有序数组的合并。 合并算法 合并算法是指将两个有序数组合并为一个数组的算法。在本资源中,我们使用了简单的比较算法来实现数组合并。该算法的步骤如下: 1. 比较两个...

Global site tag (gtag.js) - Google Analytics