十大排序算法——堆排序

思想:

(1)令i=l,并令temp= kl ;
(2)计算i的左孩子j=2i+1;
(3)若j<=n-1,则转(4),否则转(6);
(4)比较kj和kj+1,若kj+1>kj,则令j=j+1,否则j不变;
(5)比较temp和kj,若kj>temp,则令ki等于kj,并令i=j,j=2i+1,并转(3),否则转(6)
(6)令ki等于temp,结束。

Java

public class HeapSort {
    public static void main(String[] args) {
        int[] array = new int[]{2, 3, 5, 8, 9, 0, 7, 5, 1, 6, 8, 7};
        sort(array);
        System.out.println(Arrays.toString(array));
    }
    public static void sort(int[] a){
        int N = a.length;
        int[] keys = new int[N+1];
        //注意,堆的数据结构是从1开始的,0不用
        for (int i = 1; i < keys.length; i++) {
            keys[i] = a[i-1];
        }
//      //构造堆,使得堆是有序的
        for(int k = N/2;k>=1;k--) sink(keys,k,N);
        //排序,相当于毁掉堆
        while(N>1){
            exch(keys,1,N--);
            sink(keys,1,N);
        }
        //重新写回数组
        for (int i = 0; i < a.length; i++) {
            a[i] = keys[i+1];
        }
    }
   private static void sink(int[] a, int k, int N) {
        // TODO Auto-generated method stub
        while(2*k<=N){
            int j = 2*k;
            if (j < N && less(a[j], a[j+1])) j++;
            if (less(a[j], a[k])) break;
            exch(a, k, j);
            k = j;
        }
    }

    private static boolean less(int k, int j) {
        // TODO Auto-generated method stub
        return k < j;
    }

    private static void exch(int[] a, int i, int n) {
        // TODO Auto-generated method stub
        int temp = a[i];
        a[i] = a[n];
        a[n] = temp;
    }
}

C

void HeapSort(SeqIAst R)  {
       //对R[1..n]进行堆排序,不妨用R[0]做暂存单元    
        int I;    
        BuildHeap(R);
       //将R[1-n]建成初始堆
            for(i=n;i>1;i--) 
    //对当前无序区R[1..i]进行堆排序,共做n-1趟。
              {      
                  R[0]=R[1]; 
                  R[1]=R[i]; 
                  R[i]=R[0]; //将堆顶和堆中最后一个记录交换      
                  Heapify(R,1,i-1);  //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆质     
      }   
 } 

最优时间:O(nlgn)
最差时间:O(nlgn)

你可能感兴趣的:(十大排序算法——堆排序)