堆排序 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
     *

Description:

*/ private void swap(int[] a, int i, int j) { int temp=a[i]; a[i]=a[j]; a[j]=temp; } /** * @param a * @param i *

Description: 调整为大根堆,i为当前需要调整的节点

*/ private void heapAdjust(int[] a, int i,int n) { int j=i*2+1;//i的左子节点 while(jDescription:

*/ 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)); }

你可能感兴趣的:(堆排序 2018-07-05)