`
128kj
  • 浏览: 601343 次
  • 来自: ...
社区版块
存档分类
最新评论

堆排序练习:POJ 2388

阅读更多
关于堆排序请参看:http://128kj.iteye.com/blog/1679094
POJ2388题意:
  【输入】第一行为n,接下来n行分别为一个数;
  【输出】这n个数排序后的中位数
样例:
Sample Input

5
2
4
1
3
5
Sample Output

3

分析:好象用多种排序法都可以AC,这里先用堆排序,主要是复习一下堆排序代码。

排一次序后输出中位数,但效率太低了。这里先不管了。


import java.util.Scanner;
public class Main {   
  
    public static void main(String[] args) {  
     Scanner in=new Scanner(System.in);
     int n=in.nextInt();
     int[] array =new int[n+1];   
    // array[0]=100;   不参与,下标从1开始
     for(int i=1;i<=n;i++)
        array[i]=in.nextInt();
     heapSort(array);//堆排序
     System.out.println(array[n / 2+1 ]); 
     //堆排序的结果
    // for(int i=1;i<=n;i++)
    //    System.out.print(array[i]+"  ");
     }   
 
    //把a,b位置的值互换    
    public static void swap(int[] array, int a, int b) {    
        //临时存储child位置的值    
       int temp = array[a];    
       array[a]=array[b];    
       array[b]=temp;    
    }    

     /*将数组调整成堆
      *根据树的性质建堆,树节点前一半一定是分支节点,即有孩子的,所以我们从这里开始调整出初始堆
      */     
     public static void adjust(int[] array){   
        for (int i = array.length / 2; i > 0; i--)     
            adjust(array,i, array.length-1);     
  
       
      }   

    /**   
     * 调整堆,使其满足堆得定义   
     * @param i   
     * @param n   
     */     
    public static void adjust(int[] array,int i, int n) {     
          
        int child;     
        for (; i <= n / 2; ) {     
            child = i * 2;     
            if(child+1<=n&&array[child]<array[child+1])     
                child+=1;/*使child指向值较大的孩子*/     
            if(array[i]< array[child]){     
                swap(array,i, child);     
                /*交换后,以child为根的子树不一定满足堆定义,所以从child处开始调整*/     
                i = child;     
                  
            }  else break;   
        }     
    }     
     
   //对一个最大堆heap排序   
    public static void heapSort(int[] array) {     
          adjust(array);//建堆
        for (int i = array.length-1; i > 0; i--) {     
      /*把根节点跟最后一个元素交换位置,调整剩下的n-1个节点,即可排好序*/     
            swap(array,1, i);     
            adjust(array,1, i - 1);     
        }     
    }     
  

}  
0
0
分享到:
评论

相关推荐

    大(小)顶堆练习:POJ 1442

    大顶堆通常用于快速找到当前最大元素,例如在求解最大值问题或执行堆排序时。小顶堆则用于维护最小元素,例如在实现最小堆或进行堆调整时。这两种数据结构在处理动态集合并需要高效查询最大或最小元素的场景下非常...

    大顶堆应用:POJ2010

    大顶堆是一种特殊的完全二叉树,其每个节点的值都大于或等于其子节点的值,常用于实现优先队列,快速找到最大元素,或者进行高效的排序算法,如堆排序。 在编程竞赛中,大顶堆经常被用来解决时间复杂度要求较高的...

    ACM常用算法及其相应的练习题.docx

    + poj2388, poj2299 * 简单并查集的应用 * 哈希表和二分查找等高效查找法 + poj3349, poj3274, poj2151, poj1840, poj2002, poj2503 * 哈夫曼树:poj3253 * 堆 * Trie树:静态建树、动态建树 + poj2513 四、简单...

    ACM常用算法及其相应的练习题 (2).docx

    本部分涵盖了数据结构,包括串、排序、简单并查集的应用、哈希表和二分查找等高效查找法、哈夫曼树和堆、trie树。 (1) 串:poj1035, poj3080, poj1936 (2) 排序:快排、归并排、堆排 (3) 简单并查集的应用: (4) ...

    ACM常用算法及其相应的练习题 (2).pdf

    例题:poj2388、poj2299。 * 并查集:并查集是指用于解决集合操作的数据结构。例题:无。 * 哈希表和二分查找:哈希表和二分查找是指用于快速查找元素的数据结构和算法。例题:poj3349、poj3274、poj2151、poj1840、...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj2388, poj2299 - **解释**:字符串问题通常涉及字符串的模式匹配、编辑距离等问题。 #### 3. 哈希表 - **例题**:poj3349, poj3274, POJ2151, poj1840, poj2002, poj2503 - **解释**:哈希表是一种...

    acm poj300题分层训练

    poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...

    ACM训练方案

    2. 排序:快速排序、归并排序和堆排序,尤其关注与逆序数相关的归并排序。 3. 并查集:简单应用,例如路径压缩和路径查找。 4. 哈希表和二分查找:高效查找方法,如poj3349、poj3274等。 5. 哈夫曼树:poj3253展示了...

    算法训练方案详解

    - **定义**: 包括快速排序、归并排序、堆排序等。 - **应用场景**: 数据预处理。 - **示例题目**: POJ 2388, POJ 2299 - **注意事项**: 掌握各种排序算法的时间复杂度和稳定性。 **3. 并查集** - **定义**: 一...

    poj题目分类

    2. 排序:快速排序、归并排序、堆排序,如POJ2388、POJ2299。 3. 并查集:用于处理集合的合并与查询,如路径压缩和按秩合并。 4. 哈希表和二分查找:提供高效的查找操作,如POJ3349、POJ3274等。 5. 哈夫曼树:编码...

    ACM 经验 笔记 很有用的经验指导

    - **排序**:快速排序、归并排序、堆排序,如 poj2388、poj2299。 - **并查集**:处理集合连接与查询,如 poj3026。 - **哈希表** 和 **二分查找**:提高查找效率,如 poj3349、poj3274。 - **哈夫曼树**:压缩...

    poj习题答案

    "poj练习2"可能是第二组或第二部分的解答,而"poj练习"可能是更综合或者第一部分的习题解答。它们可能包含了各种编程语言(如C、C++、Java等)的代码实现,覆盖了数据结构、算法等多个方面。 详细知识点可能包括: ...

    【最新+免费】ACM主要算法.doc

    2. 排序:快速排序、归并排序和堆排序,涉及逆序数问题,如POJ 2388。 3. 并查集:简单的应用场景。 4. 哈希表和二分查找:高效查找,如POJ 3349。 5. 哈夫曼树:压缩编码,如POJ 3253。 6. 堆:如POJ 2513。 7. ...

    poj各种分类

    快速排序、归并排序和堆排序等,不仅用于排序,也常用于解决与逆序数相关的问题,如poj2388。 #### 并查集 用于处理集合的合并与查询操作,如poj3349所示。 #### 哈希表 高效查找数据的工具,利用哈希函数将数据...

    强大的POJ分类——各类编程简单题及其算法分类

    2. **排序**:包括快速排序、归并排序(涉及逆序数)、堆排序,如POJ2388、2299。 3. **并查集**:处理集合合并和查询问题。 4. **哈希表** 和 **二分查找**:提供高效查找能力,如POJ3349、3274、2151、1840、2002...

    poj:我在poj上的解题报告

    2. **排序算法**:快速排序、归并排序、冒泡排序、插入排序、选择排序、堆排序等在poj题目中频繁出现。Java的Arrays类提供了排序方法,可以直接使用,但在解决特定问题时,可能需要自定义排序算法。 3. **搜索与...

    POJ练习题算法分类

    第2693题可能考察更复杂的排序算法如快速排序、堆排序等。 #### 3. 循环结构 - **3.1-3.20** 针对循环结构设计了不同的题目,例如第2676题可能涉及简单的循环结构,而第2683题则可能考察更复杂的循环嵌套问题。 #...

    很快速的提高算法能力.docx

    - **排序**:理解快速排序、归并排序和堆排序,注意与逆序数相关的排序,如Poj2388、Poj2299。 - **并查集**:掌握其基本操作和应用。 - **哈希表和二分查找**:利用这些高效查找方法,如Poj3349、Poj3274等。 -...

Global site tag (gtag.js) - Google Analytics