堆排序

作者: RiversMa | 来源:发表于2018-01-15 18:00 被阅读32次

堆排序也是一种选择排序。有大顶堆和小顶推,下面以一个数组为例简单说明(大顶堆)。

    NSMutableArray *array = [NSMutableArray arrayWithArray:@[@23,@56,@12,@78,@90,@876,@99]];

一、首先按照层的顺序构造一个完全二叉树,然后初始化堆。

废话少说上代码:

 //建立初始堆
    for (int i = (int)(array.count-1)/2; i >= 0; i--) {//最后一个非叶子结点开始查找
        [self heapOne:array length:array.count index:i];
    }

- (void)heapOne:(NSMutableArray *)array length:(NSInteger)n index:(NSInteger)k{

    NSInteger  k1 = (2*k + 1);//左子树的索引
    NSInteger  k2 = (2*k + 2);//又子树的索引
    
    if (k1 >= n && k2 >= n) {//K已是叶子结点
        return;
    }
    
    NSInteger a1 = NSIntegerMax;
    NSInteger a2 = NSIntegerMax;
    if (k1 < n) {
        a1 = [array[k1] integerValue]; //左孩子值
    }
    if (k2 < n) {
        a2 = [array[k2] integerValue];//右孩纸值
    }
    
    if ([array[k] intValue] <= a1 && [array[k] intValue] <= a2) {//此时已经是堆了
        return;
    }
    if(a1 < a2){
        id m = array[k1];
        array[k1] = array[k];
        array[k] = m;
        [self heapOne:array length:n index:k1];
    }else{
        id m = array[k2];
        array[k2] = array[k];
        array[k] = m;
        [self heapOne:array length:n index:k2];
    }  
}

二、每次遍历即可找到最小值。循环遍历即可输出从小到大的排序。

  //边输出堆边调整
    NSUInteger n = array.count;
    while (n > 0) {
        NSLog(@"%@  ",array[0]);
        array[0] = array[n-1];
        n--;
        [self heapOne:array length:n index:0];
    }

相关文章

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 堆和堆排序

    最小K个数 堆排序 堆排序

  • JS实现堆排序

    原理 堆排序原理 实现 说明 堆排序对大文件很有效 堆排序是不稳定排序

  • iOS算法总结-堆排序

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

  • 堆排序

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

  • 排序

    原创 堆排序: 使用visit数组从本质出发获取大顶堆排序。

  • 堆排序

    堆排序

  • C++基础入门之模板堆排序(上):模板上的list的创造与操作

    整段源码链接C++的模板元堆排序 要点 组建数据结构list 组建对list的各种基本操作 堆排序中组建堆排序个个...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

网友评论

      本文标题:堆排序

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