数据结构
c语言
#include<stdio.h>
#define maxsize 20
typedef int keytype;
typedef struct{
keytype key;
}redtype;
typedef struct{
redtype r[maxsize+1];//r[0]闲置或作哨兵单元
int length; //顺序表的长度
}sqlist;
/*void Initlist(sqlist &L)
{
L->r=(keytype *)malloc(maxsize*(sizeof(redtype)));
if(!L->r) exit(OVERFLOW); //存储分配失败
L->length=maxsize+1;
}*/
void Greatlist(sqlist *L)
//建立线性表
{ int i=1,key;
printf("请输入数据元素的总个数(不大于20个):\n");
scanf("%d",&L->length);
printf("请输入各个元素:\n");
while(i<=L->length)
{
scanf("%d",&key);
L->r[i++].key=key;
}
}
int Partition(sqlist *L,int low,int high)
//交换顺序表中子表L->elem[low->->->high]的记录,
//使区轴记录到位,并返回所在的位置,此在他之前(后)的记录均不大于 它。
{
int pivotkey;
L->r[0]=L->r[low]; //用子表的第一个记录作区轴的记录
pivotkey=L->r[low].key; //区轴的记录关键字
while(low<high)
{
while(low<high&&L->r[high].key>=pivotkey)
--high;
L->r[low].key=L->r[high].key; //将比区轴记录小的记录移到低端
while(low<high&&L->r[low].key<=pivotkey)
++low;
L->r[high].key=L->r[low].key; //将比区轴记录大的记录移到高端
}
L->r[low]=L->r[0]; //区轴记录到位
return low ;
}
void Qsort(sqlist *L,int low,int high) //对顺序表的子序列L->r[low->->->high]进行排序
{
int pivotloc;
if(low<high) //长度大于1
{
pivotloc=Partition(L,low,high);//将L->r[low->->->high]一分为二
Qsort(L,low,pivotloc-1); //对低子表递归排序,pivotloc为区轴位置
Qsort(L,pivotloc+1,high); //对高子表递归排序
}
}
void Quicksort(sqlist *L)
{
Qsort(L,1,L->length);
}
void display(sqlist *L)
{
for(int i=1;i<=L->length;i++)
{
printf("%d ",L->r[i].key);
}
printf("\n");
}
//堆排序
void Heapadjust(sqlist *H,int s,int m)//构建大顶堆
{
redtype rc;
rc=H->r[s];
int j;
for(j=2*s;j<=m;j*=2)
{
if(j<m&&H->r[j].key<H->r[j+1].key)
++j;
if(rc.key>=H->r[j].key) break;
H->r[s]=H->r[j];
s=j;
}
H->r[s]=rc;
}
void Heapsort(sqlist *H)// 对顺序表进行堆排序
{
redtype rc;
int i;
for(i=H->length/2;i>0;--i) //把L.r[1...L->length]建成大顶堆
{
Heapadjust(H,i,H->length);
for(i=H->length;i>1;--i)
{
H->r[0]=H->r[1];
H->r[1]=H->r[i];
H->r[i]=H->r[0];
Heapadjust(H,1,i-1); //将L.r[1...i-1]重新调整为大顶堆
}
}
}
void main()
{
sqlist L;
//Initlist(L);
Greatlist(&L);
Quicksort(&L);
printf("快速排序后的数为:\n");
display(&L);
Heapsort(&L);
printf("经过堆排序后的大顶堆:\n");
display(&L);
}
结果和奇怪,刚开始快速排序是可以对的,堆排序不对,有谁明白的指教一下