堆排序

来源:互联网 发布:大数据学什么专业 编辑:程序博客网 时间:2024/05/19 19:31
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;}elsebreak;}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);}}

0 0