堆排序(C语言)

【堆排序算法】


  • 创建堆:升序 —-> 大堆
    降序 —-> 小堆
  • 执行以下步骤,直到数组为空
    1.把堆顶元素array[0]和当前堆的最后一个元素交换
    2.堆元素个数减1
    3.由于第一步交换元素之后,可能导致不满足堆的定义,向下调整

  • 堆排序的实践复杂度:O(n * log2 n)

  • 堆排序不稳定

代码:

 // HeapSort.h

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>

typedef int DataType;
typedef int(*Compare)(const void *a, const void *b);


int HS_CompareAscending_order(const void *a, const void *b);
int HS_CompareDescending_order(const void *a, const void *b);
void HeapSort(DataType *array, int size, Compare cmp);
 // HeapSort.c

#include "HeapSort.h"

void HS_swap(DataType *a, DataType *b)
{
    DataType temp = *a;
    *a = *b;
    *b = temp;
}

 // 降序 -- 小堆
int HS_CompareAscending_order(const void *a, const void *b)
{
    return *(DataType*)a - *(DataType*)b;
}

 // 升序 -- 大堆
int HS_CompareDescending_order(const void *a, const void *b)
{
    return *(DataType*)b - *(DataType*)a;
}

void HS_Adjust(DataType *array, int size, int parent, Compare cmp)
{
    int child = parent * 2 + 1;
    assert(array);

    while (child < size)
    {
        if ((child + 1) < size && cmp(&array[child], &array[child + 1]) > 0)
        {
            child += 1;
        }
        if (array[parent] < array[child])
        {
            HS_swap(&array[parent], &array[child]);
            parent = child;
            child = parent * 2 + 1;
        }
        else
        {
            return;
        }
    }
}


void HeapSort(DataType *array, int size, Compare cmp)
{
    int end = size - 1;
    // 1.建堆
    int root = ((size - 1) - 1) >> 1;
    for (; root >= 0; --root)
    {
        HS_Adjust(array, size, root, cmp);
    }
    // 2.排序
    while (end)
    {
        HS_swap(&array[0], &array[end]);
        HS_Adjust(array, end, 0, cmp);
        --end;
    }
}

测试

 // test.c

#include "HeapSort.h"

void TestHeapSort()
{
    int arr[] = { 53, 17, 78, 9, 45, 65, 87, 23, 31 };
    int size = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    HeapSort(arr, size, HS_CompareDescending_order);

    for (i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main()
{
    TestHeapSort();
    system("pause");
    return 0;
}

测试结果:
这里写图片描述


如有不正,还请指出,有劳!!!

猜你喜欢

转载自blog.csdn.net/Eric_qiushui/article/details/80494248