堆排序

作者: Jfeng666 | 来源:发表于2018-09-02 00:20 被阅读0次

概念自周原老师

是一种直接选择型排序的一种改进算法
简单选择排序算法+利用连续多次查找最大记录的特性=》堆排序算法

在操作系统中,将多个进程防震一个队列中,每个过程有一个优先级,总是出队优先级最高的进程执行
采用优先队列,用来实现!

基本思路

在无序区中选出最小(大)记录R[K]放到全局有序区的后面
采用堆方法来选出最小记录

堆的定义

一个序列R【1..n】,关键字为k1,k2,....,kn.
该序列满足以下性质:
1、ki<=k2i且ki<=k2i+1
2、ki<=k2i且ki<=k2i+1 (1<=I<=(n/2))
满足第一种情况的是小根堆
满足第二种情况的是大根堆

筛选算法建堆

把堆看成一个完全二叉树
我们堆这颗树进行调整,使整个二叉树成为一个堆
从最后一个分支节点往下调整为初始大根堆

过程

不断在无序区找最值并放入有序区中
然后重新调整堆直到排序结束

程序

筛选或调整算法

void sift(RecType R[], int low ,int high) //调整堆的算法,该样例是将小的数字向下调整
{
      int I=low, j=I*2; //R[I]是R[I]的左孩子
      RecType tmp=R[I];
      while (j<=high)
      {
            if (j<high && R[j].key<r[j+1].key) j++; //指向大孩子
            if (tmp.key<R[j].key)
            {
                  R[I]=R[j];
                  I=j;
                  j=2*I;
            }
            else break;
      }
      R[I]=tmp;
}

堆排序算法

void HeapSort(RecType R[], int n)
{
      int I; RecType tmp;
      for (I=n/2;i>=1;i--)  //循环建立初始堆
            sift(R, i, n);
      for (i=n; i>=2; i--)  //进行n-1次循环,完成堆排序
      {
            temp=R[1]; //将交换最值R[1]到最后
            R[1]=R[i]; R[i]=tmp;
            sift(R, 1, i-1); //筛选R[1]节点,得到i-1节点的堆(得到最值)
      }
}

相关文章

  • 堆排序

    目录 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/kgqpwftx.html