堆排序 2018-07-05

1.首先将无序序列(长度为n的数组)调整为堆,以大根堆为例
2.将堆顶元素和堆尾进行交换
3.将剩余的n-1个元素调整为堆,重复2,3.直至整个数组有序。

public void heapSort(int a[]){
        makeHeap(a,a.length);
        for(int i=a.length-1;i>=0;i--){
            swap(a,i,0);//将堆顶元素和末尾元素交换
            heapAdjust(a, 0, i);//重新对堆进行调整,注意当前位置是从0开始进行调整
        }
    }
    public void makeHeap(int a[],int n){
        for(int i=n/2-1;i>=0;i--){//从n/2-1位置开始调整
            heapAdjust(a,i,n);

        }
    }
    

    /**
     * @param a
     * @param i
     * @param j
     *<p>Description: </p>  
     */
    private void swap(int[] a, int i, int j) {
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
        
    }
    /**
     * @param a
     * @param i
     *<p>Description: 调整为大根堆,i为当前需要调整的节点</p>  
     */
    private void heapAdjust(int[] a, int i,int n) {
        int j=i*2+1;//i的左子节点
        while(j<n){
            if(j+1<n && a[j]<a[j+1]){//如果右子节点为大的,则j指向右边
                j++;
            }
            if(a[i]<a[j]){//j代表左右孩子中较大的那个
                swap(a, i, j);
            }
            else{//i所在的子树以满足大根堆的定义
                break;
            }
            i=j;//如果i,j交换后,j所在的子树可能不满足堆的定义,继续调整
            j=i*2+1;
        }
        
        
    }

    /**
     * @param args
     *<p>Description: </p>  
     */
    public static void main(String[] args) {

        //int a[]={16,7,3,20,17,8};
        int a[]={10,7,8,5,4,6,1};
        HeapSort h=new HeapSort();
        h.heapSort(a);
        System.out.println(Arrays.toString(a));
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,016评论 0 2
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,084评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,585评论 0 52
  • 1 初级排序算法 排序算法关注的主要是重新排列数组元素,其中每个元素都有一个主键。排序算法是将所有元素主键按某种方...
    深度沉迷学习阅读 5,317评论 0 1
  • 。,、自从毕业之后基本就和PPT无缘了,最近翻看大学时候做的PPT,发现了一个自己经常使用的转场动画,两页PPT能...
    Skyleep阅读 4,756评论 3 7