package Myjava;
/*
* 时间效率为O(n*logn),空间效率为O(1)
* 堆排序是不稳定的
* */
public class HeapSort {
public void sort(int[] data){
for(int i=0;i<data.length-1;i++){
bulidMaxHeap(data,data.length-1-i);
swap(data,0,data.length-1-i);
}
}
private void swap(int[] data, int i, int j) {
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
private void bulidMaxHeap(int[] data, int lastIndex) {//建立大顶堆
for(int i=(lastIndex-1)/2;i>=0;i--){
int k=i;//k为父节点
while(k*2+1<=lastIndex){//k的子节点存在
int biggerIndex=k*2+1;//k的左子节点
if(biggerIndex<lastIndex){//存在K的右子节点
if(data[biggerIndex]-data[biggerIndex+1]<0){
biggerIndex++;
}
}
if(data[k]-data[biggerIndex]<0){//父节点的值小于其子节点
swap(data,k,biggerIndex);//将其父子交换
k=biggerIndex;//确保交换后父节点的值大于子节点的值
}else {
break;
}
}
}
}
public static void main(String[] args) {
HeapSort heapSort=new HeapSort();
int[] num={49,38,65,97,76,13 ,27};
heapSort.sort(num);
System.out.println(java.util.Arrays.toString(num));
}
}
选择排序-堆排序
猜你喜欢
转载自blog.csdn.net/Answer0902/article/details/82958328
今日推荐
周排行