标签:排序 log 通过 heap ++ 空间复杂度 比较 输入数据 算法
1.算法步骤:
2.代码实现:
public static void heapSort(int[] arr){
for(int i=(arr.length-2)/2;i>=0;i--){
siftDown(arr,i,arr.length-1);//从最后一个非叶节点开始,自上向下比较,形成最大堆
}
for(int i=arr.length-1;i>=0;i--){//从最后一个元素开始,将堆顶元素(即最大)与当前位置元素交换,同时保持当前位置以前的元素构成最大堆
int tmp=arr[i];
arr[i]=arr[0];
arr[0]=tmp;
siftDown(arr,0,i-1);
}
}
public static void siftDown(int[] arr,int start,int end){
int i=start,j=2*i+1;
while(j<=end){
int tmp=arr[i];
if(j<end&&arr[j]<arr[j+1])
j++;
if(tmp>=arr[j]){
break;
}
else{
arr[i]=arr[j];
arr[j]=tmp;
if(2*j+1<=end){//如果没有到达最下层,则下移
i=j;
j=2*i+1;
}
else
break;
}
}
3.性能分析:
时间复杂度:O(nlogn)
空间复杂度:O(1)
标签:排序 log 通过 heap ++ 空间复杂度 比较 输入数据 算法
原文地址:http://www.cnblogs.com/cheerflower/p/6688154.html