内部排序C程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.简单插入排序截图:

2.折半插入排序截图:

3.快速排序截图:

4.直接选择排序截图:

5.堆排序截图:

源程序清单如下:

/*类型的定义*/

#define MAXSIZE 20

#define LT(a,b) ((a)<(b))

#include

#include

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]; /*将R[i]暂存到R[0]*/

low=1;high=i-1;

while(low<=high){ /*在R[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]; /*插入*/

}

}

int Partition(SqList *L,int low,int high){ /*快速排序*/

int pivotkey;

L->r[0]=L->r[low]; /*用子表的第一个记录作枢轴记录*/

pivotkey=L->r[low].key; /*枢轴记录关键字*/

while(low

while(lowr[high].key>=pivotkey){

--high;

}

L->r[low]=L->r[high]; /*将比枢轴记录小的记录移到低端*/

while(lowr[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

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

}

int SelectMinKey(SqList L,int i){ /*简单选择排序*/

int k;

int j;

k=i;

for(j=i;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;ilength;++i){ /*选择第i小的记录,并交换到位*/

j=SelectMinKey(*L,i); /*在R[i..n]中选择key最小的记录*/

if(i!=j){

t=L->r[i];

L->r[i]=L->r[j];

L->r[j]=t;

} /*与第i个记录交换*/

}

}

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){ /*沿key较大的孩子结点向下筛选*/

相关文档
最新文档