堆排序讲解(代码简洁)

//本文适用于对堆排序部分理解的同学,主要体现的是代码的简洁.

 /*算法思想(以大顶堆为例)
      1.将长度为n的待排序的数组进行堆有序化构造成一个大顶堆
      2.将根节点与尾节点交换并输出此时的尾节点
      3.将剩余的n -1个节点重新进行堆有序化
      4.重复步骤2,步骤3直至构造成一个有序序列*/

//堆排序
public class HeapSort {
    public static void heapSort(int arr[]){
        int size = arr.length;
        //初始化大根堆
        for (int i=0;i<arr.length;i++){
            heapInsert(arr,i);
        }
        swap(arr,0,--size);  //第一个元素和最后一个元素交换。
        while (size>0){      //剩下所有的,依次进行排序,每次确定一个位置。  
            heapify(arr,0,size);
            swap(arr,0,--size);
        }
    }
    //从后向前,确定数据元素的位置。
    public static void heapify(int arr[],int index,int size){
        int left = index*2+1; //设左孩子为left
        while (left<size){
            int largest = left+1<size&&arr[left]<arr[left+1]?left+1:left;  //左孩子和右孩子判断,取大的
            largest = arr[index]>arr[largest]?index:largest;  //左右之中大的和父节点比较
            if (largest==index){   //如果父节点大,就说明原位置不变,此时返回即可。
                return;
            }
            swap(arr,largest,index);
            index = largest;
            left = index*2+1;  //层层判断
        }

    }
    // 每插入一个元素,从新建立大根堆,用于初始化用。
    public static void heapInsert(int arr[],int index){

        while (arr[index]>arr[(index-1)/2]){
            swap(arr,index,(index-1)/2);
            index = (index-1)/2;
        }
    }
    // 设置一个交换。
    public static void swap(int arr[],int p,int q){
        int temp = arr[p];
        arr[p] = arr[q];
        arr[q] = temp;
    }
}

总结:理解了就很简单。

猜你喜欢

转载自www.cnblogs.com/liuwentao/p/9350089.html