堆排序

堆排序


堆排序:是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。可以利用數組的特點快速定位指定索引的元素。堆分爲大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值。在數組的非降序排序中,需要使用的就是大根堆,因爲根據大根堆的要求可知,最大的值一定在堆頂。


這裏寫圖片描述


這裏寫圖片描述


是否穩定:不穩定
時間複雜度:O(N*lgN)
空間複雜度:O(1)
適用場景:


#include <stdio.h>

void Swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void AdjustHeap(int* array, int size, int parent)
{
    int left = 2 * parent + 1;
    int right = 2 * parent + 2;
    int maxChild;

    if (left >= size)//出口
        return;
    //滿足堆要求
    //找最大孩子
    if (right < size) //
    {
        if (array[left] < array[right])
        {
            maxChild = right;
        }
        else
        {
            maxChild = left;
        }
    }
    else
    {
        maxChild = left; //右孩子不存在
    }
    if (array[parent] >= array[maxChild])
    {
        return;
    }
    Swap(&array[parent],&array[maxChild]);

    AdjustHeap(array, size, maxChild);//遞歸
}

void AdjustHeap_while(int* array, int size, int parent)
{
    int child = 2 * parent + 1;
    while (child < size)//滿足堆條件
    {
        if (child + 1 < size&&array[child] < array[child + 1])//找最大元素
        {
            child += 1;//右孩子大
        }
        if (array[child]>array[parent])//判斷父節點是否大於孩子(大堆條件)
        {
            Swap(&array[child], &array[parent]);
            parent = child;//向下調整
            child = 2 * parent + 1;
        }
        else
            return;
    }
}

void HeapSort(int* array,int size)
{
    //1.建堆
    int root = ((size - 2)>>1);

    for (; root >= 0; --root)
    {
        AdjustHeap(array,size,root);
        //AdjustHeap_while(array, size, root);
    }
    //2.排序——堆刪除
    int end = size - 1;

    while (end > 0)//例:有10個元素,取掉9個大的,剩餘那個自然是最小的
    {
        Swap(&array[0], &array[end]);
        AdjustHeap(array, end, 0);
        //AdjustHeap_while(array, end, 0);
        end--;
    }
} 

快速排序:https://blog.csdn.net/romantic_c/article/details/79902858
歸併排序:https://blog.csdn.net/romantic_c/article/details/79895622
冒泡排序:https://blog.csdn.net/romantic_c/article/details/78278861
計數排序:https://blog.csdn.net/romantic_c/article/details/79898442
選擇排序:https://blog.csdn.net/Romantic_C/article/details/81252784
插入排序:https://blog.csdn.net/Romantic_C/article/details/81259718
希爾排序:https://blog.csdn.net/Romantic_C/article/details/81260506

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