• 堆排序算法


    堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

     1 void heapSort(int array[],int length)
     2 {
     3     int i ;
     4     //调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
     5     //length/2-1是最后一个非叶节点,此处"/"为整除
     6     for (i = length/2 - 1; i >= 0; --i) {
     7         HeapAdjust(array, i, length);
     8     }
     9     
    10     //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
    11     for (i = length - 1; i > 0; --i) {
    12         
    13         //把第一个元素和当前的最后一个元素交换,
    14         //保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
    15         array[i] = array[0]^array[i];
    16         array[0] = array[0]^array[i];
    17         array[i] = array[0]^array[i];
    18         //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
    19         HeapAdjust(array, 0, i);
    20     }
    21 }
    22 
    23 //array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度
    24 //本函数功能是:根据数组array构建大根堆
    25 void HeapAdjust(int array[],int i,int nLength)
    26 {
    27     int biggerChild;
    28     int  temp;
    29     for (; 2*i + 1 < nLength; i = biggerChild) {
    30         //左子结点的位置=2*(父结点位置)+1
    31         biggerChild = 2 * i + 1;
    32         //查找左右子节点中的较大值
    33         if (biggerChild < nLength - 1 && array[biggerChild + 1]> array[biggerChild]) {
    34             biggerChild ++;
    35         }
    36         //如果较大值比父节点大,则把较大值的节点交换给父节点,以完成最大堆
    37         if (array[i] < array[biggerChild]) {
    38             temp = array[biggerChild];
    39             array[biggerChild] = array[i];
    40             array[i] = temp;
    41         }
    42         else
    43         {
    44             break;
    45         }
    46     }
    47 }
    1     int array[] = {23,43,2,35,534,645,4,56,45,65,75,45,3,57,64};
    2     heapSort(array, sizeof(array)/sizeof(int));
  • 相关阅读:
    JavaWeb网站技术架构
    fullcalendar插件日程管理
    PuTTY/终端使用复制、粘贴
    JAVA PERSISTENCE API (JPA)
    mysql查询当天所有数据sql语句
    Sign http
    js在新页面中返回到上一页浏览的历史位置
    Android使用Activity用作弹出式对话框
    android listview局部刷新和模拟应用下载
    如何获取drawable目录下的图片绝对路径
  • 原文地址:https://www.cnblogs.com/yanyan1119/p/5320212.html
Copyright © 2020-2023  润新知