堆排序

基本思想

步骤

By C++

#include <stdio.h>
#define MaxSize 100

typedef int KeyType;        /*关键字类型*/

typedef char ElemType[10];    /*其他数据项类型*/

typedef struct 
{    
    KeyType key;               /*关键字域*/
    ElemType data;             /*其他数据域*/
} LineList;                    /*线性表元素类型*/

void Sift(LineList R[],int low,int high)
{
    int i=low,j=2*i;             /*R[j]是R[i]的左孩子*/
    LineList tmp=R[i];
    while (j<=high) 
    {    if (j<high && R[j].key<R[j+1].key)     /*若右孩子较大,把j指向右孩子*/
            j++;                    /*j变为2i+1,指向右孩子结点*/
        if (tmp.key<R[j].key) 
        {    R[i]=R[j];           /*将R[j]调整到双亲结点位置上*/
            i=j;                  /*修改i和j值,以便继续向下筛选*/
            j=2*i;
        }
        else break;              /*筛选结束*/
    }
    R[i]=tmp;                     /*被筛选结点的值放入最终位置*/
}

void HeapSort(LineList R[],int n)
{
    int i;
    LineList tmp;
    for (i=n/2;i>=1;i--)      /*循环建立初始堆*/
        Sift(R,i,n); 
    for (i=n;i>=2;i--)       /*进行n-1次循环,完成堆排序*/
    {      tmp=R[1];            /*将第一个元素同当前区间内R[1]对换*/
        R[1]=R[i];
        R[i]=tmp;
        Sift(R,1,i-1);         /*筛选R[1]结点,得到i-1个结点的堆*/
    }
}

void main()
{
    LineList R[MaxSize];
    KeyType a[]={0,75,87,68,92,88,61,77,96,80,72};    /*有效数据从a[1]开始*/
    int n=10,i;
    for (i=0;i<=n;i++)
        R[i].key=a[i];
    printf("排序前:");
    for (i=1;i<=n;i++)
        printf("%3d",R[i].key);
    printf("\n");
    HeapSort(R,n);
    printf("排序后:");
    for (i=1;i<=n;i++)
        printf("%3d",R[i].key);
    printf("\n");
}

By Golang

go

Copyright © www.huweihuang.com 2017-2019 all right reserved,powered by GitbookUpdated at 2019-03-27 23:41:42

results matching ""

    No results matching ""