堆排序
堆排序的主要思想,利用大根堆或小根堆的数据结构,从中不断地提取最大或最小值,进行排序的一种算法。
程序思想:将无序数组进行建堆,提取堆顶值,与数组末尾的数字进行调换。对调换后的排除最后一位数字的数组重新建堆。重复这个过程,直到所有数字提取完毕,即可实现排序。
如:1,0,8,5,4,2
先进行堆排序,结果为8,5,2,0,4,1 提取堆顶数字8与数组最后一位交换 1,5,2,0,4,8
再进行最排序,结果为5,4,2,0,1,8 提取堆顶数字5与数组最后一位交换 1,4,2,0,5,8
再进行堆排序,结果为4,1,2,0,5,8 提取堆顶数字5与数组最后一位交换 0,1,2,4,5,8
再进行堆排序,结果为2,1,0,4,5,8 提取堆顶数字5与数组最后一位交换 0,1,2,4,5,8
再进行堆排序,结果为1,0,2,4,5,8 提取堆顶数字5与数组最后一位交换 0,1,2,4,5,8
再进行堆排序,结果为0,1,2,4,5,8 提取堆顶数字5与数组最后一位交换 0,1,2,4,5,8
Java实现
class heapSort{
private int[] nums;
public void sort(){
for(int i=0;i<nums.length;i++){
heapKeep(nums.length-i);
change(0,nums.length-i-1);
}
}
public void heapKeep(int max){
for(int i=0;i<max;i++){
if(2*i+1>=max){
return;
}
if(2*i+1==max-1){
if(nums[i]<nums[2*i+1]){
change(i,2*i+1);
}
return;
}
if(nums[i]<nums[2*i+1]||nums[i]<nums[2*i+2]){
if(nums[2*i+1]<nums[2*i+2]){
change(i,2*i+2);
}else{
change(i,2*i+1);
}
}
}
}
public void change(int i,int j){
int num=0;
num = nums[i];
nums[i] = nums[j];
nums[j] = num;
}
public int[] heapSort(int[] nums){
this.nums = nums;
sort();
return nums;
}
public void print(){
for(int i=0;i<nums.length;i++){
System.out.print(nums[i]+",");
}
}
}
public class heap_sort{
public static void main(String[] args){
int[] numbers = {1,0,8,5,4,2};
heapSort hs = new heapSort();
hs.heapSort(numbers);
hs.print();
}
}