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; }
}
相关资源:敏捷开发V1.0.pptx