import java.util.Arrays;
public class Sort {
public static void main(String[] args) {
int arr[]={2,4,5,1,0,3,9,8,7,6};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void Swap(int arr[],int i,int j){
arr[i]=arr[i]+arr[j];
arr[j]=arr[i]-arr[j];
arr[i]=arr[i]-arr[j];
}
public static void adjustHeap(int arr[],int i,int length){
int temp=arr[i];
for (int k=2*i+1; k< length; k=2*k+1) {
if(k+1<length && arr[k]<arr[k+1]){//如果左子結點小於右子結點,k指向右子結點
k++;
}
if(arr[k]>temp)
{
arr[i] = arr[k];
i = k;
}
else
{
break;
}
}
arr[i] = temp;
}
public static void sort(int []arr){
//1.構建大頂堆
for(int i=arr.length/2-1;i>=0;i--){
//從第一個非葉子結點從下至上,從右至左調整結構
adjustHeap(arr,i,arr.length);
}
//2.調整堆結構+交換堆頂元素與末尾元素
for(int j=arr.length-1;j>0;j--){
Swap(arr,0,j);//將堆頂元素與末尾元素進行交換
adjustHeap(arr,0,j);//重新對堆進行調整
}
}
}
堆排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.