堆排序: 1.先创建好大根堆 2.每一趟将堆顶元素加入有序子序列【即将堆顶元素与待排序序列中的最后一个元素交换】 3.将待排序元素序列再次调整为大根堆
图解:
书上代码是从i=1存储元素,相当于在i=4(i=len/2)时调整 |
---|
下处代码是从i=0存储元素,所以在i=3(i=len/2-1)时调整 |
public class 堆排序 {
public static void main(String[] args) {
int nums[]={49,38,65,97,76,13,27,49,55,04};
sort(nums);
System.out.println(Arrays.toString(nums));
}
static void sort(int nums[]){
int len = nums.length;
BuildMaxHeap(nums);
for (int i=len-1;i>0;i--){
swap(nums,i,0);
HeadAdjust(nums,0,i);
}
}
static void BuildMaxHeap(int nums[]){
int len = nums.length;
for(int i=len/2-1;i>=0;i--){
HeadAdjust(nums,i,nums.length);
}
}
static void HeadAdjust(int[] nums, int k, int len) {
int temp=nums[k];
for (int i =2*k+1;i<len;i=i*2+1){
if (i+1<len&&nums[i]<nums[i+1])
i++;
if (temp>=nums[i]) break;
else{
nums[k]=nums[i];
k=i;
}
}
nums[k]=temp;
}
static void swap(int nums[],int a,int b){
int temp = nums[a];
nums[a]=nums[b];
nums[b]=temp;
}
}
|