• 算法之路——堆排序


      排序的另一种基本思想是通过选择来排序。最具代表性的也是最简单的就是简单选择排序。然后有了根据锦标赛发展来的树形排序。可是树形排序,有着不少可以改进的地方,堆排序就是对其的改进。具体的算法见严亚敏老师的数据结构的279页。

    代码如下:

    /*这是heap_sort.h文件*/
    #ifndef heap_sort
    #define heap_sort

    #define MAXSIZE 100
    typedef int KeyType;

    typedef struct {
    KeyType data;
    //其他的属性
    }RedType,* PRedType;

    typedef struct {
    RedType list[MAXSIZE];
    int length;
    }SqList, * PSqList;

    #define K_T "%d" //用于输入输出 如 printf(K_T, p->list[i].data);

    #define OK 0
    #define P_NULL 1
    #define TOOBIG 2
    #define NUM_ERROR 3

    int inputList (PSqList p,int length);
    int outputList (PSqList p);
    int heapSort(PSqList p, int (*comp)(void *,void *));
    #endif



    /*这是heap_sort.cpp文件*/
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include "heap_sort.h"

    int inputList (PSqList p,int length)
    {//输入序列

    if (p == NULL)
    return P_NULL; //1,指针是空的
    if (length > MAXSIZE)
    return TOOBIG; //2,要输入的序列太多
    srand(time(NULL));
    int i = 0;
    for (i = 0; i < length; i++)
    p->list[i].data = rand()%10000;
    //if (scanf(K_T,&(p->list[i].data)) != 1)
    // return NUM_ERROR; //3,输入的数字有误
    p->length = length;
    return OK; //0
    }

    int outputList (PSqList p)
    {//输出序列
    if (p == NULL)
    return P_NULL;

    int i = 0;
    for (i =0; i < p->length; i++)
    printf (K_T"\t",p->list[i].data);
    putchar('\n');
    return OK;
    }//outputList

    int heapAdjust (PSqList p, int (*comp)(void *, void *), int s, int m)
    {//已知p->list[s...m]中记录的关键字除[s]外,均满足堆的定义,本函数调整第s个关键字,是[s...m]成为一个大顶堆(对给定的比较函数而言)
    int i;
    RedType tmp;
    tmp = p->list[s];

    //第i个元素的打一个后继为2*i+1,[0]存放着第一个元素
    for (i = 2*s+1; i <= m; i=2*s+1)
    {
    if (i < m && comp(&(p->list[i+1]),&(p->list[i])) > 0 )
    i++;
    if (comp(&(p->list[i]),&(tmp)) < 0)
    break;
    p->list[s] = p->list[i];
    s = i;
    }
    p->list[s] = tmp;
    return 0;
    }//headAdjust

    int heapSort (PSqList p, int (*comp)(void *, void *))
    {
    RedType tmp;
    int i;
    for (i = p->length/2-1; i >= 0; i--)
    heapAdjust(p, comp, i,p->length-1);

    for (i = p->length-1; i > 0; i--)
    {
    tmp = p->list[i];
    p->list[i] = p->list[0];
    p->list[0] = tmp;

    heapAdjust(p, comp, 0, i-1);
    }

    return OK;
    }//heapSort


    /*这是main.cpp文件*/
    #include <stdio.h>
    #include <stdlib.h>
    #include "heap_sort.h"
    int comp(void *, void *);
    int main (int argc, char * argv)
    {
    int status;
    PSqList test;
    test = (PSqList)malloc(sizeof(SqList));
    int n = 0 ;
    printf("请输入第一组待排序的数的个数(输入0结束循环):");

    while (1)
    {
    while (scanf("%d",&n) != 1)
    {
    puts("输入有误!请重新输入!");
    while(getchar() != '\n');
    }

    if (n == 0) //结束
    break;
    if (status = inputList(test, n) != 0)
    {
    puts("输入的数字有误!");
    while(getchar() != '\n');
    //exit(status);
    }
    heapSort(test, comp);
    outputList (test);
    printf("请输入下一组待排序的数的个数(输入0结束循环):");
    }
    free(test);
    return 0;
    }

    int comp(void * d1, void * d2)
    {//比较函数
    return (((PRedType)d1)->data - ((PRedType)d2)->data );
    }



  • 相关阅读:
    集合
    WPF自定义控件--模拟手机密码输入控件,在输入时显示最后一个输入密码字符
    配置VS不生成XML和PDB文件
    Wlan常见命令(可以查看连接密码)
    云栖社区用机器人爬CSDN的文章?
    Marshal.PtrToStringAnsi中文乱码
    各种手工DIY
    yii2修改默认控制器
    3D模型网站分享
    SemanticZoom配合GridView组件的使用关键点
  • 原文地址:https://www.cnblogs.com/svking/p/heapSort.html
Copyright © 2020-2023  润新知