C语言综合实现所有排序方法及效率比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#define N 50000
typedef char elemtype; typedef struct
{
int key;
elemtype otheritem;
}recdtype,*Recdtype;
recdtype R[N];
//直接插入排序
void InsertSort(Recdtype R,int n) {
int i,j;
for(i=2;i<=n;i++)
{
R[0]=R[i];
j=i-1;
while(R[0].key { R[j+1]=R[i]; j--; } R[j+1]=R[0]; } }/*InsertSort*/ //折半查找 void BinSort(recdtype R[],int n) {int i,j,low,high,m; for(i=2;i<=n;i++) {R[0]=R[i]; low=1; high=i-1; while(low<=high) {m=(low+high)/2; if(R[0].key high=m-1; else low=m+1;} for(j=i-1;j>=high+1;j--) R[j+1]=R[j]; R[high+1]=R[0]; } }/*BinSort*/ //希尔排序 void ShellSort(recdtype R[],int n) { int i,j; for(int d=N/2;d>=1;d=d/2) { for(i=1+d;i<=n;i++) { R[0]=R[i]; j=i-d; while(j>0&&R[0].key { R[j+d]=R[j]; j=j-d; } R[j+d]=R[0]; } } }/*ShellSort*/ //冒泡排序 void BubbleSort(recdtype R[],int n) { int lastExchange; recdtype temp; for(int i=0;i { lastExchange=1; for(int j=n-1;j>=i;j--) { if(R[j+1].key { temp=R[i+1]; R[i+1]=R[i]; R[i]=temp; lastExchange=0; } if(lastExchange) break; } } }/*BubbleSort*/ //快速排序 int Partition(recdtype R[],int l,int h)//一次划分算法{ int i=l; int j=h; R[0]=R[i]; int x=R[i].key ; while(i { while(i R[i]=R[j]; while(i R[j]=R[i]; } R[i]=R[0]; return i; } void QuickSort(recdtype R[],int s,int t)//快速排序{ int k; if(s { k=Partition(R,s,t); QuickSort(R,s,k-1); QuickSort(R,k+1,t); } } //直接选择排序 void SelectSort(recdtype R[],int n) { int i,j,k; for(i=1;i { k=i; for(j=i+1;j<=n;j++) if(R[j].key k=j; if(i!=k) { R[0]=R[i]; R[i]=R[k]; R[k]=R[0]; } } }/*SlectSort*/ //堆排序 void Shift(recdtype R[],int i,int m) { int j; R[0]=R[i]; for(j=2*i;j<=m;j*=2) { if(j j++; if(R[0].key { R[i]=R[j]; i=j; } else break; } R[i]=R[0]; }/*Shift*/ void HeapSort(recdtype R[],int n) { recdtype temp; int i; for(i=n/2;i>0;i--) Shift(R,i,n); for(i=n;i>1;i--) { temp=R[1]; R[1]=R[i]; R[i]=temp; Shift(R,1,i-1); } }/*HeapSort*/ //二路归并算法 void Merge(recdtype R[],int low,int middle,int high) { int h,i,j,k; recdtype R1[N+1]; h=low; i=low; j=middle+1; while(h<=middle&&j<=high) {