leetcode 排序问题

1.堆排序

//大顶堆的构造,传入的i是父节点
void HeapAdjust(int k[],int p,int n)
{
    int i,temp;
    temp = k[p];
    for (i = 2 * p; i <= n;i*=2)    //逐渐去找左右孩子结点
    {
        //找到两个孩子结点中最大的
        if (i < n&&k[i] < k[i + 1])
            i++;
        //父节点和孩子最大的进行判断,调整,变为最大堆
        if (temp >= k[i])
            break;
        //将父节点数据变为最大的,将原来的数据还是放在temp中,
        k[p] = k[i];    //若是孩子结点的数据更大,我们会将数据上移,为他插入的点提供位置
        p = i;
    }
    //当我们在for循环中找到了p子树中,满足条件的点,我们就加入数据到该点p,注意:p点原来数据已经被上移动了
    //若没有找到,就是相当于对其值不变
    //插入
    k[p] = temp;
}

//大顶堆排序
void HeapSort(int k[], int n)
{
    int i;
    //首先将无序数列转换为大顶堆
    for (i = n / 2; i > 0;i--)    //注意由于是完全二叉树,所以我们从一半向前构造,传入父节点
        HeapAdjust(k, i, n);

    //上面大顶堆已经构造完成,我们现在需要排序,每次将最大的元素放入最后
    //然后将剩余元素重新构造大顶堆,将最大元素放在剩余最后
    for (i = n; i >1;i--)
    {
        swap(k[1], k[i]);
        HeapAdjust(k, 1, i - 1);
    }
}

2.快排

猜你喜欢

转载自www.cnblogs.com/AntonioSu/p/11881597.html