美文网首页
算法-堆排序

算法-堆排序

作者: 笑破天 | 来源:发表于2022-07-11 12:56 被阅读0次

堆排序分两步:
建堆:把数组中元素按照堆的结构排成一定的顺序
排序:把有序的堆结构的数组元素排成升序
heapify本质上是一个排序方法,把无序变成堆的结构序列,递归迭代可以把下面所有子序列也排好。建堆过程用的正是这一点,而排序过程则是每次把堆顶(最大的值)拿出去,然后把剩下的被交换搞混乱的序列重新归为堆序列。

1、原理图解

数组中的堆结构

2、代码

void heapify(int arr[], int len, int i)
{
    int largest = i;
    int lson = i * 2 + 1;
    int rson = i * 2 + 2;
    NSLog(@"i=%d l=%d r=%d",largest,lson,rson);
    print_arr(arr, 10);

    if (lson < len && arr[largest] < arr[lson])
        largest = lson;
    if (rson < len && arr[largest] < arr[rson])
        largest = rson;
    if (largest != i)
    {
        swap(&arr[largest], &arr[i]);
        heapify(arr, len, largest);
    }
}

// 堆排序入口
void heap_sort(int arr[], int len)
{
    int i;
    // 建堆
    NSLog(@"建堆");
    for (i = len / 2 - 1; i >= 0; i--)
        heapify(arr, len, i);

    // 排序
    NSLog(@"排序");
    for (i = len - 1; i > 0; i--)
    {
        swap(&arr[i], &arr[0]);
        heapify(arr, i, 0);
    }
}

3、运行图解

建堆
i=4 l=9 r=10
6 1 5 3 9 2 10 8 4 7 
i=3 l=7 r=8
6 1 5 3 9 2 10 8 4 7 
i=7 l=15 r=16
6 1 5 8 9 2 10 3 4 7 
i=2 l=5 r=6
6 1 5 8 9 2 10 3 4 7 
i=6 l=13 r=14
6 1 10 8 9 2 5 3 4 7 
i=1 l=3 r=4
6 1 10 8 9 2 5 3 4 7 
i=4 l=9 r=10
6 9 10 8 1 2 5 3 4 7 
i=9 l=19 r=20
6 9 10 8 7 2 5 3 4 1 
i=0 l=1 r=2
6 9 10 8 7 2 5 3 4 1 
i=2 l=5 r=6
10 9 6 8 7 2 5 3 4 1 
排序
i=0 l=1 r=2
1 9 6 8 7 2 5 3 4 10 
i=1 l=3 r=4
9 1 6 8 7 2 5 3 4 10 
i=3 l=7 r=8
9 8 6 1 7 2 5 3 4 10 
i=8 l=17 r=18
9 8 6 4 7 2 5 3 1 10 
i=0 l=1 r=2
1 8 6 4 7 2 5 3 9 10 
i=1 l=3 r=4
8 1 6 4 7 2 5 3 9 10 
i=4 l=9 r=10
8 7 6 4 1 2 5 3 9 10 
i=0 l=1 r=2
3 7 6 4 1 2 5 8 9 10 
i=1 l=3 r=4
7 3 6 4 1 2 5 8 9 10 
i=3 l=7 r=8
7 4 6 3 1 2 5 8 9 10 
i=0 l=1 r=2
5 4 6 3 1 2 7 8 9 10 
i=2 l=5 r=6
6 4 5 3 1 2 7 8 9 10 
i=0 l=1 r=2
2 4 5 3 1 6 7 8 9 10 
i=2 l=5 r=6
5 4 2 3 1 6 7 8 9 10 
i=0 l=1 r=2
1 4 2 3 5 6 7 8 9 10 
i=1 l=3 r=4
4 1 2 3 5 6 7 8 9 10 
i=3 l=7 r=8
4 3 2 1 5 6 7 8 9 10 
i=0 l=1 r=2
1 3 2 4 5 6 7 8 9 10 
i=1 l=3 r=4
i=0 l=1 r=2
2 1 3 4 5 6 7 8 9 10 
i=0 l=1 r=2
1 2 3 4 5 6 7 8 9 10 

相关文章

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 数据结构与算法

    常见排序算法 堆排序 算法大全 算法大汇总

  • 堆排序算法思想

    前两天看了看堆排序算法,啃了半天的书,最后搞明白了堆排序算法,今天有时间给大家说说这个堆排序算法。首先讲一下算法的...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 常用排序算法之堆排序

    堆排序算法 运行 输出

  • 算法与数据结构(六):堆排序

    title: 算法与数据结构(六):堆排序tags: [算法与数据结构, C语言, 堆排序]date: 2019-...

  • 数据结构

    Q:堆排序 A:1 堆排序算法(图解详细流程)2 堆排序 Q:排序算法时间复杂度与稳定性 选择排序为什么不稳定:举...

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 排序算法(六)堆排序

    排序算法(六 )堆排序 1.算法思路  堆排序(Heap-Sort)是一种基于二叉堆的排序算法。即将一个无序序列构...

网友评论

      本文标题:算法-堆排序

      本文链接:https://www.haomeiwen.com/subject/wvhnbrtx.html