内部排序C程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(low --high; } L->r[low]=L->r[high]; /*将比枢轴记录小的记录移到低端*/ while(low ++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;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较大的孩子结点向下筛选*/