zoukankan      html  css  js  c++  java
  • 【排序】Heap Sort

    What's heap ? it's main feature: root is the smallest(largest), nodes with children are larger than children. Root which is the smallest ,called Small Heap. Otherwise, we called it Big Heap if it's largest.

    we now represent the heap in data stuct of Heap in the way of array.

    In order to finish heap sort, we need to do 2 things:

    1. build a heap
    2. remove the root ,which is largest/smallest element , and rebuild the heap

    Here is the code:

    #include <stdio.h>
    #include "type.h"
    void swap(ElemType *a, ElemType *b)
    {
        ElemType tmp = *a;
        *a=*b;
        *b=tmp;
    }
    void HeapAdjust(SqList *L, int start, int end)
    {
        printf("Adjust %d %d \n", start, end);
        int j, temp, i;
        temp = L->data[start];
        i = start;
        //Note:2*start , if start==0, then j==0 . That's why we NEED THE LIST TO START FROM 1, INSTEAD OF 0
        for(j = 2*start; j<=end; j*=2)
        {
            //compare left child [2*start] and right child [2*start+1]
            if(L->data[j]<L->data[j+1] && j<end)
                j++;//right child is larger than left child

            if(temp>=L->data[j])//temp(position [start]) is already the largest
                break;

            L->data[start] = L->data[j];// Note:change

            start = j;//above line changed the heap, we now need to reconstruct
        }
        printf("largest now[%d]:%d <-> [%d]:%d \n",start, L->data[start], temp, i);    
        L->data[start] = temp;
    }
    void HeapSort(SqList *L)
    {
        //construct the list into a heap, starting from nodes with children
        for(int i = (L->length)/2; i>0; i--)
            HeapAdjust(L, i, L->length);
        
        //swap out the largest , and then reconstruct the list into a new heap
        for(int i=L->length; i>1; i--)
        {
            swap(&(L->data[1]), &(L->data[i]));
            HeapAdjust(L, 1, i-1);
        }
    }
    void printContent(SqList *L)
    {
        for(int i = 1; i<= L->length; i++)
        {
            printf("%d \t",L->data[i] );
        }
    }
    int main(void)
    {
        SqList l ;
        l.data={-1,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
        l.length = 16;

        printContent(&l);
        printf("\n");
        HeapSort(&l);
        printContent(&l);
        printf("\n");

        return 0;

    Note that: we create array with [0] empty , for the conveniece for j=2*start, during of computing the tree.

    EOF

  • 相关阅读:
    ajax请求或者页面需要缓存,代码如下
    jquery cookie 删除不了的处理办法
    大家来找茬-SpringMVC中Tomcat正常启动,始终访问不了Controller,出404错
    简单的批量读取外部insert文并插入DB
    关于Jquery.validate.js中动态删除验证remove方法的Bug
    Struts2.3.16.3 基本9个jar包
    CAS SSL证书错误处理
    cas 4.X单点登录实战
    如何高效利用时间
    ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)
  • 原文地址:https://www.cnblogs.com/no7dw/p/2795733.html
Copyright © 2011-2022 走看看