排序7-堆排序

排序7-堆排序



序列->完全二叉树


建立堆序(正序)

/*
    @param arr[] 待调整数组
    @param index 待调的结点下标
    @param len 数组长度
*/
void heapAdjust(int arr[], int index, int len){
    //保存待调整结点的下标
    int max = index;
    //保存父结点的左右结点下标
    int lChild = index*2+1;
    int rChild = index*2+2;
    //判断下标不越界, 且左子结点大于父节点, 更新最大值的下标
    if(lChild<len && arr[lChild]>arr[max]){
        max = lChild;
    }
    //判断下标不越界, 且右子结点大于父节点, 更新最大值的下标
    if(rChild<len && arr[rChild]>arr[max]){
        max = rChild;
    }
    //如果max不指向父节点,交换max和父节点位置,继续递归调用,调整交换后堆的堆序
    if(max!=index){
        mySwap(arr,max,index);
        heapAdjust(arr,max,len);
    }
}

堆排序

/*
    @param arr[] 待调整数组
    @param len 数组长度
*/
void heapSort(int arr[],int len){
    //初始化堆 len/2-1得到最后一个非叶子结点的下标 (上滤)
    for (int i = len/2-1; i>=0; i--){
        heapAdjust(arr,i,len);
    }
    //调整堆序
    for (int i = len-1; i>=0; i--){
        //交换堆顶元素和最后一个元素    
        mySwap(arr,0,i);
        //调整堆序(从头结点开始调整)
        heapAdjust(arr,0,i);
    }
}
posted @ 2024-04-26 16:03  HIK4RU44  阅读(9)  评论(0)    收藏  举报