频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

数据结构教程 第三十七课 实验八 排序实验

来源: 作者: 出处:巧巧读书 2006-04-28 进入讨论组

教学目的: 掌握简单插入排序、快速排序、堆排序的算法并加以应用。

教学重点:

教学难点:

授课内容:

实现下述三种算法,并用以下无序序列加以验证:

49,38,65,97,76,13,27,49

一、简单插入排序

二、快速排序

三、堆排序

以上算法的C源程序。

#define MAXSIZE 20
#define LT(a,b) ((a)<(b))
typedef int KeyType;
typedef int InfoType;
typedef struct{
  KeyType key;
  InfoType otherinfo;
}RedType;
typedef struct{
  RedType r[MAXSIZE+1];
  int length;
}SqList;

void InsertSort(SqList *L)
{
  int i,j;
  for(i=2;i<=L->length;++i)
    if(LT(L->r[i].key,L->r[i-1].key)){
      L->r[0]=L->r[i];
      for(j=i-1; LT(L->r[0].key,L->r[j].key); --j)
	L->r[j+1]=L->r[j];
      L->r[j+1]=L->r[0];
    }
}

void BInsertSort(SqList *L)
{
  int i,j;
  int low,high,m;
  for(i=2;i<=L->length;++i){
    L->r[0]=L->r[i];
    low=1;high=i-1;
    while(low<=high){
      m=(low+high)/2;
      if (LT(L->r[0].key,L->r[m].key))
	high=m-1;
      else low=m+1;
    }
    for(j=i-1;j>=high+1;--j)
      L->r[j+1]=L->r[j];
    L->r[high+1]=L->r[0];
  }
}

/* QuickSort related function */
int Partition(SqList *L,int low,int 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]=L->r[high];
    while(low<high&&L->r[low].key<=pivotkey) ++low;
    L->r[high]=L->r[low];
  }
  L->r[low]=L->r[0];
  return low;
}
void QSort(SqList *L,int low,int high)
{
  int pivotloc;
  if(low<high){
    pivotloc=Partition(L,low,high);
    QSort(L,low,pivotloc-1);
    QSort(L,pivotloc+1,high);
  }
}
void QuickSort(SqList *L)
{
  QSort(L,1,L->length);
}                    /* End QuickSort related function*/

/*SelectSort related function */
int SelectMinKey(SqList L,int i)
{
  int k;
  int j;
  k=i;
  for(j=i;j<L.length+1;j++)
    if(L.r[k].key>L.r[j].key)
      k=j;
  return k;
}
void SelectSort(SqList *L)
{
  RedType t;
  int i,j;
  for(i=1;i<L->length;++i){
    j=SelectMinKey(*L,i);
    if(i!=j) {
      t=L->r[i];
      L->r[i]=L->r[j];
      L->r[j]=t;
    }
  }
}           /*End SelectSort related function */


typedef SqList HeapType;
void HeapAdjust(HeapType *H,int s,int m)
{
  RedType rc;
  int j;
  rc=H->r[s];
  for(j=2*s;j<=m;j*=2){
    if(j<m&&LT(H->r[j].key,H->r[j+1].key)) ++j;
    if(!LT(rc.key,H->r[j].key)) break;
    H->r[s]=H->r[j];
    s=j;
  }
  H->r[s]=rc;
}
void HeapSort(HeapType *H)
{
  RedType t;
  int i;
  for(i=H->length/2;i>0;--i)
    HeapAdjust(H,i,H->length);
  for(i=H->length;i>1;--i){
    t=H->r[1];
    H->r[1]=H->r[i];
    H->r[i]=t;
    HeapAdjust(H,1,i-1);
  }
}

main()
{
  int a[]={49,38,65,97,76,13,27,49};
  int i,k;
  SqList s;
  printf("\nThe record to be sort:\n");
  for(i=1;i<9;i++)
    {
      s.r[i].key=a[i-1];
      printf("%d  ",a[i-1]);
    }
  s.length=i-1;
  printf("\n\t1,InsertSort\n\t2,BInsertSort\n\t3,QuickSort\n\t4,SelectSort\n");
  printf("\t5,HeapSort\n\tPress 1..5 to select a function\n");
  scanf("%d",&k);
  switch(k){
    case 1:
      InsertSort(&s);
      break;
    case 2:
      BInsertSort(&s);
      break;
    case 3:
      QuickSort(&s);
      break;
    case 4:
      SelectSort(&s);
      break;
    case 5:
      HeapSort(&s);
      break;
    default:printf("No function which you select.\n");
  }
  printf("\nThe records be sorted:\n");
  for(i=1;i<9;i++)
    printf("%d  ",s.r[i].key);
  printf("\n\n\tPress any key to exit.\n");
  getch();
}
URl收藏 http://www.qqread.com/data-structure/u634104102.html 更多文章 更多内容请看数据结构ASP.NET教程FreeBSD使用教程专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章