算法之路——堆排序
排序的另一种基本思想是通过选择来排序。最具代表性的也是最简单的就是简单选择排序。然后有了根据锦标赛发展来的树形排序。可是树形排序,有着不少可以改进的地方,堆排序就是对其的改进。具体的算法见严亚敏老师的数据结构的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 );
}
Keep Looking