排序算法-堆排序

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;
}

 

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