丑陋的代码本来不想拿上来的~想到也是以前辛苦的成果~果断上传~ #include <stdio.h> #include <time.h> #include <math.h> #include <stdlib.h> #include <malloc.h> #include <conio.h> #include <conio.h> void ShellSort(int data[],int arrSize)//希尔排序 { int tmp; int i,j,hCnt,h,k; const int num(8); int increments[num];//间隔数 for(h=1,i=0;h<arrSize&&i<num;++i) { increments[i]=h; h=3*h+1; } for(--i;i>=0;--i) { h=increments[i]; for(hCnt=h;hCnt<2*h;++hCnt) { for(j=hCnt;j<arrSize;) { tmp=data[j]; k=j; while(k-h>=0&&tmp<data[k-h]) { data[k]=data[k-h]; k-=h; } data[k]=tmp; j+=h; } } } } void csort( int *a,int n)//插入 { int j,m,max,y; for (j=1;j<=n-1;j++) { for (m=0;m<=j-1;m++) { if (a[j]<a[m]) { max=a[j]; for (y=j-1;y>=m;y--) a[y+1]=a[y]; a[m]=max; } } } } void bcsort( int *a,int n)//折半插入 { int j,m,y,low,high,temp; for (j=1;j<=n-1;j++) { low=0;high=j-1; temp=a[j]; while (low<=high) { m=(low+high)/2; if (a[m]>a[j]) high=m-1; else if (a[m]<a[j]) low=m+1; else break; } for (y=j-1;y>=high+1;y--) a[y+1]=a[y]; a[high+1]=temp; } } //********************************* BobbleSort.h文件 void BobbleSort(int a[],int N) { int i,j,k; for (i=1;i<N-1;i++) { k = i; for (j=i+1;j<N-1;j++) { if (a[k] > a[j]) { k = j; } } int temp = a[k]; a[k] = a[i]; a[i] = temp; } } //************************************* QuickSort.h文件 int Partion(int a[],int low,int high) //找出分割位置 { int key; key=a[low]; while(low<high) { while(low<high&&a[high]>=key) high--; a[low]=a[high]; while(low<high&&a[low]<=key) low++; a[high]=a[low]; } a[low]=key; return low; } void QuickSort(int a[],int low,int high) { int po; if(low<high) { po=Partion(a,low,high); QuickSort(a,low,po-1); //递归调用 QuickSort(a,po+1,high); } else return ; } //***************************************** HeapSort.h 文件 void swap(int &a,int &b) { a=a+b; b=a-b; a=a-b; } void Heapify(int a[],int k,int m) //整理堆 { int k1=2*k; int k2=2*k+1; if(k2<=m) { if((a[k1]>=a[k2]&&a[k2]>=a[k])||(a[k1]>=a[k]&&a[k2]<=a[k])) { swap(a[k1],a[k]); Heapify(a,k1,m); } else if((a[k1]<=a[k2]&&a[k1]>=a[k])||(a[k2]>=a[k]&&a[k]>=a[k1])) { swap(a[k2],a[k]); Heapify(a,k2,m); } } else if(k1<=m) { if(a[k1]>=a[k]) { swap(a[k1],a[k]); Heapify(a,k1,m); } } else return ; } void HeapSort(int a[],int m) { int i; for(i=m/2;i>=1;i--) Heapify(a,i,m); for(i=m;i>1;i--) { swap(a[i],a[1]); Heapify(a,1,i-1); } } void heapfy( int a[],int start,int end)//自写堆排 { int temp,i; temp=a[start]; for (i=2*start;i<=end;i*=2) { if (i<end&&a[i]<a[i+1]) i++; if (temp>a[i]) break; // swap(a[start],a[i]); a[start]=a[i]; start=i; } a[start]=temp; } void heapsort( int a[],int n) { int i,j; for (i=n/2;i>0;i--) { heapfy(a,i,n); } for (i=n;i>1;i--) { swap(a[i],a[1]); heapfy(a,1,i-1); } } int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } void q_sort(int numbers[], int left, int right)//快排2 { int pivot, l_hold, r_hold; l_hold = left; r_hold = right; pivot = numbers[left]; while (left < right) { while ((numbers[right] >= pivot) && (left < right)) right--; if (left != right) { numbers[left] = numbers[right]; left++; } while ((numbers[left] <= pivot) && (left < right)) left++; if (left != right) { numbers[right] = numbers[left]; right--; } } numbers[left] = pivot; pivot = left; left = l_hold; right = r_hold; if (left < pivot) q_sort(numbers, left, pivot-1); if (right > pivot) q_sort(numbers, pivot+1, right); } //自己编译的快排 int main() { int N; int *a,*b; time_t start ,end; double usetime; int i,j; i=0; printf("输入数组元素N的值: "); scanf("%d",&N); b=(int *)malloc((N+1)*sizeof(int)); if(!b) exit(1); for(j=1;j<=N;j++) b[j]=rand()%1000; while(i<=8) { if(i==8) printf("-------------------- 冒 泡 排 序--------------------/n"); else if(i==2) printf("-------------------- 快 速 排 序--------------------/n"); else if(i==1) printf("-------------------- 堆 排 序 --------------------/n"); else if(i==0) printf("-------------------- 自 编 堆 排 序 --------------------/n"); else if(i==7) printf("-------------------- 插 入 排 序 --------------------/n"); else if(i==4) printf("-------------------- 希 尔 排 序 --------------------/n"); else if(i==5) printf("-------------------- 系 统 快 排 排 序 --------------------/n"); else if(i==3) printf("-------------------- 自 己 快 排 排 序 --------------------/n"); else if(i==6) printf("-------------------- 折 半 插 入 排 序 --------------------/n"); a=(int *)malloc((N+1)*sizeof(int)); if (i==0||i==1) { for(j=1;j<=N;j++) a[j]=b[j]; } else { for(j=1;j<=N;j++) a[j-1]=b[j]; } srand(time(NULL)); start=clock(); if(i==8) { BobbleSort(a,N); } else if(i==2) { QuickSort(a,0,N-1); } else if(i==1) { HeapSort(a,N); } else if(i==0) { heapsort(a,N); } else if(i==7) { csort(a,N); } else if(i==4) { ShellSort(a,N); } else if(i==5) { qsort(a,N,sizeof(*(a+1)),cmp); } else if(i==3) { q_sort(a,0,N-1); } else if(i==6) { bcsort(a,N); } end=clock(); usetime=(end-start)*1.0/CLOCKS_PER_SEC; printf("该排序所花的时间为:"); printf("%lf 秒/n",usetime); free(a); i++; } getch(); return 0; }