首页 > 代码库 > 堆排序
堆排序
1.算法步骤:
- 根据初始输入数据,利用堆的调整算法siftDown()形成初始堆;
- 通过一系列的元素交换和重新调整堆进行排序。
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)
堆排序