八大排序之堆排序

一、堆排序的 JAVA 实现

   堆排序:是一种树形选择排序,在排序中,将待排序的记录r[1..n]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序中选择关键字最大(或最小)的记录。

  下面直接代码实现

package HeapSort;

public class HeapingSort {

    public void HeapSort(int a[]){
        CreapHeap(a);
        for (int i=a.length-1;i>0;--i){
            a[0]=a[1];
            a[1]=a[i];
            a[i]=a[0];
            HeapAdjust(a,1,i-1);
        }
        for (int i=1;i<a.length;++i){
            System.out.println(a[i]);
        }
    }
    public void HeapAdjust(int a[],int mid,int high){
        int hc=a[mid];
        for (int i=mid*2;i<high;i*=2){
            if (i<high&&a[i]<=a[i+1])   //比较2mid 和 2(mid+1),得到这两个中最大的数字,作为下一次比较的值。
                i++;     
            if (a[mid]>=a[i])    //比较mid 和  上次比较得到的最大值,若是满足,则就是堆 ,直接结束循环。若是不满足,则进行交换。
                break;
            a[mid]=a[i];
            mid=i;
        }
        a[mid]=hc;
    }

    public void CreapHeap(int a[]){
        for (int i=(a.length-1)/2;i>0;--i){ //调整堆,
            HeapAdjust(a,i,a.length-1);
        }
    }
    public static void main(String[] args) {
        int[] a=new int[]{0,38,65,97,76,13,27,49};
        new HeapingSort().HeapSort(a);
    }

3、算法分析:
a、时间复杂度:O(nlog2n)
b、空间复杂度:O(1)
4、算法特点
a、是不稳定的排序
b、只能用于顺序结构,不能用于链式

 

猜你喜欢

转载自www.cnblogs.com/jxp0112/p/10786353.html