标签:个性 转换 流程 com 假设 get 概念 算法 comm
堆排序主要是运用了二叉树的性质来进行的排序。
在进行堆排序之前我们先了解一下二叉树的几个性质:
1.在排序使用二叉树的时候我们要排序的数组的第0个位置其实是不可以用的,这个时候如果我们要排序的数组为[3,1,0,2,8,4,2]时,我们首先要把它变为[0,3,1,0,2,8,4,2],我们把他转换为二叉树的时候是这样的
2.观察此二叉树我们可以发现几个公式:
3.我们进行堆排序的时候一般先从最后的节点开始,先比较最后的子节点,找出较大的子节点与父节点比较,如果子节点大于父节点则子节点与父节点交换。此流程大概是这样的
明白了上方的概念以后我们可以就可以进行简单的操作了:
接下来上代码
public static void sort(int []arr,int length){
if(length==1){
return;
}
for (int i=(length-1)/2;i>=1;i--){
int max=i*2;//先假设最大的子节点为左儿子
if(max+1<length&&arr[max+1]>arr[max]){//如果右儿子不超出数组下标且比左儿子大
max++;//最大的子节点为右儿子
}
if(arr[i]<arr[max]){ //如果子节点大于父节点
swap(arr,i,max);//交换方法
}
}
swap(arr,1,length-1);//将跟节点与数组最后一个节点交换
sort(arr,length-1);//递归调用此方法,不过排序好的就不需要再次比较了,所以忽略它
}
public static void swap(int []arr,int a ,int b){
int temp=arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void main(String []args){
int []arr = {0,3,1,0,2,8,4,2};
sort(arr,arr.length);
System.out.println(Arrays.toString(arr));
}
堆排序讲完了。在这里温馨提示大家,学习算法时,我们没必要拘泥于代码的实现,那没有意义。我的建议就是深入理解步骤,当你理解步骤以后代码是随你怎么玩都可以的。
标签:个性 转换 流程 com 假设 get 概念 算法 comm
原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9245662.html