欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【数据结构】--》堆的应用

程序员文章站 2024-03-15 21:52:18
...

上篇博客对堆的一些基本实现,现在来实现堆的两个应用:

 **海量TopK问题(这里仅用一小部分数据进行测试)---》堆排序**

1,堆排序的实现代码:

此处com使用来传一个函数指针,方便指定升序还是降序,本次是按升序来测试;
void HeapSort(Heap* hp, DataType arr[], int size, Compare com)
{
    assert(hp);
    int i = size - 1;
    CreateHeap(hp, arr, size, com);
    while (i>=0)
    {
        swap(&(hp->_array[0]),&( hp->_array[hp->_size - 1]));
        swap(&arr[i--], &(hp->_array[hp->_size - 1]));
        hp->_size--;
        AdjustDown(hp, 0, com);
    }
}

堆排序的测试代码:

void testHeapSort()
{
    Heap hp;
    int i = 0;
    Compare com = Greater;
    InitHeap(&hp, com);
    DataType arr[] = { 10, 50, 32, 5, 76, 9, 40, 88 };
    int size = sizeof(arr) / sizeof(arr[0]);
    for (; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    HeapSort(&hp, arr, size, com);
    for (int i=0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
}

- 2,海量TopK的问题实现代码:
此处com使用来传一个函数指针,方便指定找最大的前K个数还是最小的前K个数

void TopK(Heap *hp,DataType arr[], int K,int size,Compare com)
{
    assert(hp);
    CreateHeap(hp, arr, K, com);
    while (K<=size)
    {
        if (arr[K] > hp->_array[0])
        {
            hp->_array[0] = arr[K];
            AdjustDown(hp, 0, com);
        }
        K++;
    }
    printf("TopK元素分别是: ");
    for (int i = 0; i <hp->_size; i++)
    {
        printf(" %d ", hp->_array[i]);
    }
}

海量TopK的测试代码:

void testTopK()
{
    Heap hp;
    InitHeap(&hp,less);
    int arr[] = { 1, 3, 5, 4, 5, 6, 8, 9, 0, 78, 6, 56, 34, 23, 167, 56, 435326, 23, 546, 769, 87, 90, 8, 6, 756756 };
     TopK(&hp,arr,5,sizeof(arr)/sizeof(arr[0]),less);
}

——————————————————THANKS————————————————————————