美文网首页
堆排序(Heap Sort)

堆排序(Heap Sort)

作者: 有毒的程序猿 | 来源:发表于2018-12-10 15:30 被阅读8次
1. 算法描述

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点值总是小于(或者大于)它的父节点。通过调整把最大值或者最小值调整到顶端然后确定此值的位置,对剩余的数据继续进行堆排序.

  • 创建堆,第一趟使数据满足堆的特性;
  • 交换首数据及未排序数据末尾数据,固定排序好的数据位置;
  • 对剩余数据进行堆排序;
2. 过程演示
Heap Sort.gif
堆排序

原始数据

34 54  12  78 3  45  9 

// 建堆过程
                34
          54           12                            
       78     3     45     9 
    

                34
          54           45                            
       78     3     12     9 


               34
         78          45                            
      54     3   12      9 


               78
          34         45                            
      54     3    12      9        


            78
       54        45                            
    34     3  12      9 

// 一趟堆排序过程

              9
        54          45                            
    34      3   12       #78
    
              54
        9           45                            
    34     3    12       #78

                 54
         34              45                            
    9         3     12       #78

                 54
          34              45                            
      9       3      12        #78        

// 第二次交换 确定了  54,78 的位置
                12
         34               45                            
    9         3      #54        78# 


3. 代码实现
/*
 * 堆排序
 */

- (void)heapSort:(NSMutableArray *)sortArray {
    
    // 建大跟堆
    NSInteger lastFatherNote = sortArray.count / 2;
    for (NSInteger i = lastFatherNote; i >= 0; i --) {
        [self adjustHeap:sortArray head:i length:sortArray.count];
        self.count1 ++;
    }
    
    // 开始调整排序
    for (NSInteger i = sortArray.count - 1; i >= 0; i--) {
        [sortArray exchangeObjectAtIndex:0 withObjectAtIndex:i];  // 建堆过程 已经把最大值调整到顶部  所以把顶部下沉确定位置 以后不再进入排序过程
        [self adjustHeap:sortArray head:0 length:i];
        self.count1 ++;
    }
}


// 堆的调整
- (void)adjustHeap:(NSMutableArray *)sortArray
              head:(NSInteger)head
            length:(NSInteger)length {
    
    NSInteger left = 2 *head + 1;
    NSInteger right = 2 *head + 2;
    
    if (left >= length) {
        return; // 只有一个元素 不做处理
    }
    
    NSInteger bigger = left;
    
    if (right < length) {
        if ([sortArray[right] integerValue] > [sortArray[bigger] integerValue])  {
            bigger = right;
        }
    }
    
    // 如果大的子节点 大于父节点  则交换 继续向下调整
    if ([sortArray[bigger] integerValue] > [sortArray[head] integerValue]) {
        [sortArray exchangeObjectAtIndex:bigger withObjectAtIndex:head];
        [self adjustHeap:sortArray head:bigger length:length];
    }
    self.count2 ++;
}
4. 验证
 NSArray *arr = [self pakageNumber:1000];    
 NSMutableArray *sortArray = [NSMutableArray arrayWithArray:arr];
 [self heapSort:sortArray];
count1  :1501                        // 外层循环
count2 : 8414                      // 内层循环

一万条数据所用时间
time:0.044660;

相关文章

  • JavaScript的排序算法——堆排序

    堆排序(Heap Sort) 堆排序(Heap Sort)是一种基于比较的排序算法。堆排序可以被认为是一种改进版的...

  • 堆排序(Heap Sort)

    1. 算法描述 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构...

  • 堆排序(Heap Sort)

    一、算法概述 1.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于...

  • 堆排序(heap sort)

    堆排序可以认为是对选择排序的一种优化最好最坏平均时间复杂度:O(nlogn) 空间复杂度:O(1) 属于不稳定排序...

  • 3.2-选择排序-堆排序

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

  • 03-堆排序(Heap Sort)

    堆排序(Heap Sort) 结合上一讲的内容,发现选择排序可以使用堆排序来进行优化。所以堆排序可以认为是对选择排...

  • iOS - 堆排序

    Demo_github 堆排序 堆排序(Heap Sort)是一种树形选择排序,是对直接选择排序的有效改进。 堆的...

  • 堆排序

    一、定义 堆排序(Heap Sort)是一种基于优先队列(堆实现)的排序方式。堆排序的步骤如下: 初始时待排序元素...

  • 7、堆排序(Heap Sort)

    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆...

  • 堆排序

    预备知识 堆排序 堆排序(heap sort)是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的...

网友评论

      本文标题:堆排序(Heap Sort)

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