实现直接插入排序,二分法插入排序、希尔排序,冒泡排序,快速排序,直接选择排序的算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define Max 100 //数组长度
typedef struct
{
int key; //关键字
char data; //其他字段
}LineList; //线性表的类型
void BubbleSort(LineList R[],int n)
{
int i,j,exchange;
LineList temp;
for(i=0;i { exchange = 0; for(j=n-1;j>i;j--) //比较找出最小记录 if(R[j].key { //比较移行 temp=R[j]; R[j]=R[j-1]; R[j-1]=temp; exchange=1; } if(exchange==0) //交换结束后结束return; } } /* 直接插入排序,升序*/ void StraightInsertSort (LineList R[],int n) { int i,j; LineList temp; for(i=1;i { temp=R[i]; j=i-1; //j从第一个开始比较while(j>=0 && temp.key { //元素后移让位给temp R[j+1]=R[j]; j--; //恢复前一个位置 } R[j+1]=temp; //在j+1位置插入temp } } /* 快速排序,升序*/ void QuickSort(LineList R[],int s,int t) { //对R[s]至R[t]的元素进行快速排序 int i=s,j=t; LineList temp; if(s { temp=R[s]; //用区间的第1个记录作为基准 while(i!=j) //从区间两端交替向中间扫描,直至i=j为止 { while(j>i && R[j].key>temp.key) { //从右向左扫描,找第1个关键字小于temp.key的R[j] j--; R[i]=R[j]; //找到这样的R[j],则R[i]和R[j]交换 while(i i++; //从左向右扫描,找第1个关键字大于temp.key的R[i] R[j]=R[i]; //找到这样的R[i],则R[i]和R[j]交换 } R[i]=temp; QuickSort(R,s,i-1); //对左区间递归排序 QuickSort(R,i+1,t); //对右区间递归排序 } } } /* 二分法插入排序,升序*/ void BinarySort(LineList R[], int n) { int x; int l, r, m; int i, j; /* 从最先的两个元素开始排序*/ for (i=1; i { x=R[i].key; l=1; /* 下限*/ r=i-1; /* 上限*/ while (l<=r) { /* 中间位置*/ m=(l+r)/2; if (x else l=m+1; /* 下限上移*/ } /* 插入元素*/ for (j=i-1; j>=l; j--) R[j+1]=R[j]; R[l].key=x; } } /* 直接选择排序,升序*/ void SelectSort(LineList R[],int n) { int i,j,k; LineList tmp; for (i=0;i { k=i; for (j=i+1;j if (R[j].key k=j; //用k指出每趟在无序区段的最小元素 tmp=R[i]; //将R[k]与R[i]交换 R[i]=R[k]; R[k]=tmp; } } /* 希尔排序,升序*/ void ShellSort(LineList R[],int n) { int i,j,gap; LineList tmp; gap=n/2; //增量置初值 while (gap>0) { for (i=gap;i tmp=R[i]; j=i-gap; while (j>=0 && tmp.key R[j+gap]=R[j]; j=j-gap; //移到本组中的前一个元素