堆排序学习

3 篇文章 0 订阅
堆排序是一种原地排序算法,结合了插入排序和合并排序的优点,拥有O(nlgn)的时间复杂度。该算法包括max_heapify、build_max_heap和heap_sort三个关键过程。max_heapify用于保持最大堆性质,build_max_heap则能在无序数组上快速构造最大堆,而heap_sort对数组进行原地排序。本文通过示例代码详细介绍了堆排序的实现过程。
摘要由CSDN通过智能技术生成

堆排序(heap sort),像合并排序二不像插入顺序,堆排序的运行时间为O(nlgn)。像插入排序而不像合并排序,它是一种原地(in place)排序算法:在任何时候,数组中只有常数个元素存储在输入数组以外。结合了插入排序和合并排序的优点。

堆排序还引入另一种算法设计技术:利用某种数据结构(在此算法中为”堆“)来管理算法执行中的信息。堆数据结构不只是在堆排序中有用,还可以构成一个有效的优先队列。

有三个过程:

1、max_heapify过程,其运行时间为O(lgn),是保持最大堆性质的关键。

2、build_max_heap过程,以线性时间运行,可以在无序的输入数组基础上构造出最大堆。

3、heapsort过程,运行时间为O(nlgn),对一个数组原地进行排序。


学习实现代码:

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

#define ARRAY_SIZE 10

void print_array(int *, const int);
int parent(int);
int left(int);
int right(int);
int exchange(int *, int, int);
void max_heapify(int *, int, const int);
void build_max_heap(int *, const int);
void heap_sort(int *, const int);

int main(void)
{
        int a[ARRAY_SIZE] = {16, 4, 10, 14, 7, 9, 3, 2, 8, 1};
        //max_heapify(a, 1, ARRAY_SIZE);
        //build_max_heap(a, ARRAY_SIZE);

        heap_sort(a, ARRAY_SIZE);
        print_array(a, ARRAY_SIZE);
}

void print_array(int * a, const int size)
{
        int i = 0;
        for(; i < size; i++)
                printf("%d ", a[i]);
        putchar('\n');
}

int parent(int i)
{
        return (i - 1) >> 1;
}

int left(int i)
{
        return (i << 1) + 1;
}

int right(int i)
{
        return (i << 1) + 2;
}

int exchange(int * a, int i, int j)
{

        if(i != j)

        {
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;

        }
}

void max_heapify(int * a, int i, const int heap_size)
{
        int left_index = left(i), right_index = right(i), largest = 0;
        if(left_index < heap_size && a[left_index] > a[i])
        {
                largest = left_index;
        }
        else
        {
                largest = i;
        }
        if(right_index < heap_size && a[right_index] > a[largest])
        {
                largest = right_index;
        }
        if(largest != i)
        {
                exchange(a, i, largest);
                max_heapify(a, largest, heap_size);
        }
}

void build_max_heap(int * a, const int heap_size)
{
        int i = (heap_size >> 1) - 1;
        for(; i >= 0; i--)
        {
                max_heapify(a, i, heap_size);
        }
}

void heap_sort(int * a, const int heap_size)
{
        build_max_heap(a, heap_size);
        int i = heap_size - 1;
        int temp_heap_size = heap_size;

        for(; i >= 1; i--)
        {
                exchange(a, 0, i);
                temp_heap_size = temp_heap_size - 1;
                max_heapify(a, 0, temp_heap_size);
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值