堆排序没那么复杂吧。。
试试我这个,逻辑比较紧。。
public class T_1{
public static void main(String[] args){
int[] a={1,4,2,6,3,7,5};
heapSort(a,a.length);
}
public static void createHeap(int[] a,int n,int h){
int i,j;
int flag;
int temp;
i=h; // i 为要建堆的二叉树根结点下标
j=2*i+1; // j为i的左孩子结点的下标
temp=a[i];
flag=0;
// 沿左右孩子中值较大者重复向下筛选
while(j<n && flag!=1){
// 寻找左右孩子几点中的较大者,j为其下标
if(j<n-1 && a[j]<a[j+1]) j++;
if(temp>a[j]){
flag=1;
}else{
a[i]=a[j];
i=j;
j=2*i+1;
}
}
a[i]=temp; // 把最初的a[i] 赋值最后的a[j]
}
public static void initCreateHeap(int[] a,int n){
int i;
for(i=(n-1)/2;i>=0;i--){
createHeap(a,n,i);
}
}
public static void heapSort(int[] a,int n){
int i;
int temp;
initCreateHeap(a,n); // 初始化创建最大堆
for(i=n-1;i>0;i--){ // 当前最大堆个数每次递减1
temp=a[0];
a[0]=a[i];
a[i]=temp;
createHeap(a,i,0); // 调整根节点满足最大堆
}
for(int x=0;x<a.length;x++){
System.out.println(a[x]+" ");
}
}
} |