package sun;
public class Sort {
/**
* 算法思想:从无序序列所确定的完全二叉树的第一个非叶子结点开始,从右至左,从下至上,对每个
* 结点进行调整,最终得到一个最大堆
* @param a 堆排序,使用完全二叉树,因此下标需要从1开始
* @param low
* @param high
*/
public static void shift(int[] a,int low,int high){
int i = low,j = 2*i; //a[j]是a[i]的左孩子
int temp = a[i];
while(j < high){
//从右至左
if(j < high && a[j] < a[j+1]) //比较左右孩子,选大的
++j;
if(temp < a[j]){
a[i] = a[j];
i = j;
j = 2*i;
}else
break;
}
a[i] = temp;
}
public static void heapSort(int[] a,int n){
int i;
int temp;
//从下到上进行堆调整,4->8结点,3->8结点,2->8结点.......
for(i = n/2 ; i >= 1 ; --i)
shift(a,i,n);
//从无序序列中,取出最大元素,放入序列最后(这个位置就是该元素的最后位置)
for(i = n ; i >= 2 ; --i){
temp = a[1];
a[1] = a[i];
a[i] = temp;
shift(a,1,i-1);
}
}
public static void main(String[] args) {
//第一个元素不参与排序过程,因此位置始终不变
int[] arr = { 0,49, 38, 65, 97, 76, 13, 27, 49 };
heapSort(arr,arr.length - 1);
for (int a : arr)
System.out.println(a);
}
}
堆排序
最新推荐文章于 2021-07-24 23:27:25 发布