排序算法-堆排序

1.堆排序

1)首先将序列构建为大顶堆

2)取出当前大顶堆的根结点,将其与序列末尾元素进行交换(此时末尾元素为已排序序列的最大值);

3)对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质;

4)重复2、3步骤,直到堆中只有一个元素位置

2.数据结构-堆

详见 数据结构-堆

3.算法

//递归方式构建堆,parent为第一个非叶子结点下标,num为数组个数
void buildHeap(int *arr, int num,int parent)
{
    // parent的左子节点
    int sonLeft = 2 * parent + 1;

    // parent的右子节点
    int sonRight = 2 * parent + 2;

    int temp = parent;
    //判断左右孩子和父亲中的最大值,获取下标索引值
    if (sonRight < num  && arr[sonRight] > arr[temp])
    {
        temp = sonRight;
    }
    if (sonLeft < num  && arr[sonLeft] > arr[temp])
    {
        temp = sonLeft;
    }
    
    if (temp != parent)
    {
        swap(arr[temp], arr[parent]);
        buildHeap(arr, num, temp);
    }
}

//堆排序
void heapSort(int *arr, int num)
{
    // 构建大根堆(从最后一个非叶子节点向上)
    for (int i = num / 2 - 1; i >= 0; i--)
    {
        buildHeap(arr, num, i);
    }
    //先将第一个元素和已经排好的元素前一位做交换,再从新调整(刚调整的元素之前的元素),直到排序完毕
    for (int i = num - 1; i > 0; i--)
    {
        swap(arr[0], arr[i]);
        buildHeap(arr, i ,0);
    }
}

int main()
{
    int a[] = { 9,1,2,0,5,7,4,8,6,3,5 };

    cout << "排序前: " << endl;
    printArr(a, 11);
    heapSort(a, 11);
    cout << "\n";
    cout << "排序后: " << endl;
    printArr(a, 11);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章