堆排序和快速排序

来源:互联网 发布:淘宝手机助手. 编辑:程序博客网 时间:2024/06/08 16:13

 

数据结构

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);
}

 

结果和奇怪,刚开始快速排序是可以对的,堆排序不对,有谁明白的指教一下

原创粉丝点击