[排序算法 ,堆排序] 堆排序算法 java实现。

大顶堆对应升序排列,小顶堆对应降序排列
过程:
1.根据输入的无序数组,构建堆
2.将构建好的堆的root从堆移除,剩余数据继续调整成堆

/**
 * Created by tianhongyan on 2018/4/8.
 */
public class HeapSort {

    /**小顶堆 降序排列**/
    public void smallHeapSort(int[] array){
        for(int i = array.length/2 -1; i >= 0; i--){
            smallHeadAdjust(array,i,array.length-1);
        }
        for(int i=array.length-1;i>=0;i--){
            swapArrayItem(array,0,i);
            smallHeadAdjust(array,0,i-1);
        }
    }
    /**小顶堆调整过程**/
    private void smallHeadAdjust(int[] array, int i, int arrayLength){
        int temp=array[i];
        for(int k =i*2+1;k<=arrayLength;k=2*k+1 ) {
            if(k+1 <= arrayLength && array[k] > array[k+1]){
                k++;
            }
            if(temp>array[k]){
                swapArrayItem(array,i,k);
                i=k;
            }else {
                break;
            }
        }
    }

    /**大顶堆 升序排列**/
    public void bigHeadSort(int[] array){
        for(int i=array.length/2-1;i>=0;i--){
            bigHeapAdjust(array,i,array.length);
        }
        for(int i=array.length-1;i>=0;i--){
            swapArrayItem(array,0,i);
            bigHeapAdjust(array,0,i-1);
        }
    }
    /**大顶堆 调整过程**/
    private void bigHeapAdjust(int[] array, int i,int arrayLength){
        int temp = array[i];
        for(int k = 2*i+1; k<=arrayLength; k=2*k+1){
            if(k+1 <= arrayLength && array[k] < array[k+1]){
                k++;
            }
            if(temp < array[k]){
                swapArrayItem(array,i,k);
                i=k;
            }
        }
    }

    /**交换数据**/
    private void swapArrayItem(int[] array, int i, int j){
        int temp = array[j];
        array[j] = array[i];
        array[i] = temp;
    }

    public static void main(String[] args){
        int[] array = new int[]{1,2,3,4,5,9,8,7,6};
        HeadSort headSort = new HeadSort();
        headSort.smallHeapSort(array);//降序排列
        System.out.println(Arrays.toString(array));
        headSort.bigHeadSort(array);//升序排列
        System.out.print(Arrays.toString(array));
    }


}

猜你喜欢

转载自blog.csdn.net/tianhongyan1122/article/details/79856598
今日推荐