`
hy036630
  • 浏览: 3628 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

堆排序

J# 
阅读更多

public class HeapSort   
{   
    int [] a = {3,1,5,2,4,9,8,7,6,4};   
    //数组的索引以0开始 ID也是从0开始   
    //父节点的索引   
       
    public int parentID(int childID)   
    {   
        return (childID-1)/2;   
        }   
       
    //左孩子的索引   
    public int leftChildID(int parentID)   
    {   
        return parentID*2+1;   
        }   
     /*
        创建大顶堆,将数组初始为一个大顶堆
     */
    public void creatMaxHeap()   
    {   
        int lastID = a.length-1;   
        for(int i = parentID(lastID); i >= 0 ; i--)   
                {    
             int k=i;   
        while(leftChildID(k) <= lastID)   
        {   
        int j = leftChildID(k);   
                   if(j < lastID)   //如果有两个孩子
    {   
            if(a[j] < a[j+1])   //选大的那个孩子
                  {   
        j++;   
        }   
             }   
          if(a[k] < a[j])   如果父结点比孩子小
                                {   
                                    int temp = a[k];   
                                    a[k] = a[j];   
                                    a[j] = temp;   
                                    k=j;   
                                    }   
                                    else break;                        
                            }   
                }   
    }   
     //调整大顶堆 
    public void maintainHeap(int lastID)   
    {   
        int k=0;   
         while(k <= parentID(lastID))   
            {   
                int j = leftChildID(k);   
                if( j < lastID)   
                {   
                    if(a[j] <= a[j+1])   
                            j++;   
                       
                    }   
                    if( a[k] <a[j] )   
                    {   
                        int temp = a[j];   
                        a[j] = a[k];   
                        a[k] = temp ;   
                        k = j;   
                        }   
                        else break;   
                        }   
    }   
           
    public void heapSort()   
    {   
        creatMaxHeap();   
        int lastID = a.length-1;   
        while(lastID > 0)   
        {   
            int temp = a[lastID];   
            a[lastID] = a[0];   
            a[0] = temp;   
            lastID--;   
            if(lastID > 0)   
                        maintainHeap(lastID);   
               
            }   
           
        }   
       
    public void printA()   
    {   
        for(int i = 0; i< a.length; i++)   
            {   
                System.out.println(a[i]);   
                }   
        }   
    public static void main(String args[])   
    {   
        HeapSort hs = new HeapSort();   
        hs.heapSort();   
        hs.printA();   
        }   
           
  
} 

分享到:
评论

相关推荐

    图解堆排序

    在学习堆排序前,我们需要知道顺序存储二叉树和堆的知识点。 一、顺序存储二叉树 1.概念:顺序存储二叉树即用数组的方式存储二叉树的节点 2.顺序存储二叉树的特点: ①顺序二叉树通常只考虑完全二叉树 ②第n个元素的...

    堆排序(C语言实现)

    堆排序(C语言实现)算法思想步骤程序 算法思想 见: 4. 选择排序—堆排序(Heap Sort) 算法导论——堆排序heapsort 步骤 1. 将n个元素建立初始堆,第一个节点放在数组下标1中,因此n个节点对应数组 a[1] ~ a[n],...

    堆排序 减治法——C++代码

    堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在计算机科学中,堆通常被理解为一个完全二叉树,其中每个父节点的值都大于或等于(大顶堆)或小于或等于(小顶堆)其子节点的值。堆排序算法...

    C++实现堆排序

    1、 实现堆排序算法。 2、 理论分析并实验验证堆排序算法的时间复杂度。

    堆排序代码

    内部排序之堆排序的具体代码实现,简单同时也易于看懂

    C#堆排序实现方法

    主要介绍了C#堆排序实现方法,实例分析了C#对排序的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics