HeapImpl

package com.liuxt.sort.impl;

import com.liuxt.sort.Sort;

 

public class HeapImpl implements Sort {

 
 /**
  * 用堆排序算法实现对数组的递增排序。
  * 基本思想:
  *   先按对的定义排列成一个序列输出堆的最小关键字(对小顶堆而言),然后将剩余的关键字最调整为新堆。
  *   得到次小的关键字,反复知道所有的关键字都有序。
  * 
  *  时间复杂度o(nlogn)
  *  空间复杂度
  * @param data
  */
 
 public void sortData(int[] data) {
   int i=0,t=0;
   int n=data.length;
   for(i=n/2-1;i>=0;--i)
    heapadjust(data,i,n-1);
   for(i=n-1;i>0;--i){
    t=data[0];
    data[0]=data[i];
    data[i]=t;
    heapadjust(data,0,i-1);
   }
  
 }

 /**
  * 将一个整数数组中的元素调整成大根堆
  * @param data
  * @param s
  * @param m
  */
 private void heapadjust(int[] data, int s, int m) {
  /**data[s..m]所构成的一个元素序列中,除了data[s]外,其余元素均满足堆的定义**/
  /**调整元素data[s]的位置,使data[s..m]成为一个大根堆**/
  int t,j;
  t=data[s];// 备份元素data[s],为以后找到适合的位置后插入
  for(j=2*s+1;j<m;j=j*2+1){ //沿着值较大的孩子节点向下筛选。
   if(j<m&&data[j]<data[j+1]) ++j; //j是值较大的元素的索引下标
   if(!(t<data[j])) break; //用s记录待插入元素的下标。
   data[s]=data[j];s=j; //插入备份元素。
  }//end for
  data[s]=t;
 }

}

你可能感兴趣的:(算法,J#)