#include <iostream> #include <sys/time.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long int a[10005],b[10005],n; void select_sort() { int i,j,x; for(i=0;i<n-1;i++) { x = i; for(j=i+1;j<n;j++) { if(b[j]<b[x]) x=j; } if(x!=i) swap(b[x],b[i]); } } void insert_sort() { int i,j; for(i=1;i<n;i++) { int tmp = b[i]; for(j=i;j>0 && tmp<b[j-1];j--) { b[j] = b[j-1]; b[j-1] = tmp; } } } void show() { int i; for(i = 0;i<n;i++) printf("%d ",b[i]); printf(" "); } LL getCurrentTime() { struct timeval tv; gettimeofday(&tv,NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; } int main() { int i,j,k,t; LL t1,t2; double tsum; while(~scanf("%d",&n) && n) { printf("数据规模:%d 20组样本时间(ms): ",n); srand(unsigned(time(0))); for(j=1;j<=20;j++) { tsum=0; for(i = 0;i<n;i++) a[i] = rand()%1000; for(k=0;k<1000000;k++) { for(i = 0;i<n;i++) b[i] = a[i]; t1 = getCurrentTime(); select_sort(); t2 = getCurrentTime(); tsum+=(t2-t1); } show(); printf("% lf",tsum/1000000); if(j%5==0) printf(" "); } } return 0; }
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <sys/time.h> #include <windows.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define mem(a,b) memset(a,b,sizeof(a)) const int T = 1;//循环次数 const int G = 20;//样本组数 int a[100005],b[100005],c[100005],n; void select_sort()//选择排序 { int i,j,x; for(i=0;i<n-1;i++)//循环n次 { x = i; for(j=i+1;j<n;j++)//找最小的一个数 { if(b[j]<b[x]) x=j; } if(x!=i) swap(b[x],b[i]);//与i交换 } } void insert_sort()//插入排序 { int i,j; for(i=1;i<n;i++) { int tmp = b[i]; for(j=i;j>0 && tmp<b[j-1];j--)//寻找在已排序好的数列中插入的位置 { //交换 b[j] = b[j-1]; b[j-1] = tmp; } } } void bubble_sort()//冒泡排序 { int i,j; for(i=0;i<n-1;i++)//循环n次 { for(j=0;j<n-1-i;j++)//将最大的移到最后面 { if(b[j]>b[j+1]) swap(b[j],b[j+1]);//不断交换 } } } void merge_arr(int lo,int mid,int hi)//合并两个有序数组 { int len = 0,i=lo,j=mid+1; while(i<=mid && j<=hi)//将较小的入列 { if(b[i]<=b[j]) c[len++]=b[i++]; else c[len++] = b[j++]; } //将剩余的入列,下面两个只会执行一个 while(i<=mid) c[len++] = b[i++]; while(j<=hi) c[len++] = b[j++]; for(i=0;i<len;i++) b[lo+i] = c[i]; } void merge_sort(int lo,int hi)//归并排序 { if(lo<hi)//二分排序 { int mid = (lo+hi)>>1; merge_sort(lo,mid); merge_sort(mid+1,hi); merge_arr(lo,mid,hi); } } void quick_sort(int lo,int hi)//快速排序 { if(lo<hi)//二分 { int x=b[lo],i=lo,j=hi; while(i<j)//填坑法 { while(i<j && b[j]>=x) j--;//从右往左找到一个比基准大的 if(i<j) { b[i] = b[j]; i++; } while(i<j && b[i]<x) i++;//从左往右找到一个比基准小的 if(i<j) { b[j] = b[i]; j--; } } b[i] = x; quick_sort(lo,i); quick_sort(i+1,hi); } } void showa() { int i; for(i = 0;i<n;i++) printf("%d ",a[i]); printf(" "); } void showb() { int i; for(i = 0;i<n;i++) printf("%d ",b[i]); printf(" "); } LL getCurrentTime()//计算算法执行时间 { /* struct timeval tv; gettimeofday(&tv,NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; */ DWORD start; start = GetTickCount(); //printf("time %d ",start); return start; } int main() { int i,j,k,t; LL t1,t2; double tsum,tsum2,tsum3,tsum4,tsum5,sum=0,sum2=0,sum3=0,sum4=0,sum5=0; while(~scanf("%d",&n) && n) { printf("数据规模:%d 20组样本时间(ms): ",n); printf("选择 插入 归并 冒泡 快速 "); srand(unsigned(time(0))); for(j=1;j<=G;j++)//样本组数 { tsum=tsum2=tsum3=tsum4=tsum5=0; for(i = 0;i<n;i++) a[i] = rand()%1000000;//随机数组 //show(); for(k=0;k<T;k++)//数据小时循环次数 { for(i = 0;i<n;i++) b[i] = a[i]; //showb(); t1 = getCurrentTime(); select_sort(); t2 = getCurrentTime(); tsum+=(t2-t1); //showb(); //printf(" "); for(i = 0;i<n;i++) b[i] = a[i]; //showb(); t1 = getCurrentTime(); insert_sort(); t2 = getCurrentTime(); tsum2+=(t2-t1); //showb(); //printf(" "); for(i = 0;i<n;i++) b[i] = a[i]; //showb(); t1 = getCurrentTime(); merge_sort(0,n-1); t2 = getCurrentTime(); tsum3+=(t2-t1); //showb(); //printf(" "); for(i = 0;i<n;i++) b[i] = a[i]; //showb(); t1 = getCurrentTime(); bubble_sort(); t2 = getCurrentTime(); tsum4+=(t2-t1); //showb(); //printf(" "); for(i = 0;i<n;i++) b[i] = a[i]; //showb(); t1 = getCurrentTime(); quick_sort(0,n-1); t2 = getCurrentTime(); tsum5+=(t2-t1); //showb(); //printf(" "); } //show(); sum+=tsum/T;sum2+=tsum2/T;sum3+=tsum3/T;sum4+=tsum4/T;sum5+=tsum5/T; printf("%lf %lf %lf %lf %lf ",tsum/T,tsum2/T,tsum3/T,tsum4/T,tsum5/T); } printf("平均时间: "); printf("%lf %lf %lf %lf %lf ",sum/20,sum2/20,sum3/20,sum4/20,sum5/20); } return 0; }
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <sys/time.h> #include <windows.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define mem(a,b) memset(a,b,sizeof(a)) const int T = 1;//循环次数 const int G = 20;//样本组数 int a[100005],b[100005],c[100005],n; void select_sort() { int i,j,x; for(i=0;i<n-1;i++) { x = i; for(j=i+1;j<n;j++) { if(b[j]<b[x]) x=j; } if(x!=i) swap(b[x],b[i]); } } void insert_sort() { int i,j; for(i=1;i<n;i++) { int tmp = b[i]; for(j=i;j>0 && tmp<b[j-1];j--) { b[j] = b[j-1]; b[j-1] = tmp; } } } void bubble_sort() { int i,j; for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if(b[j]>b[j+1]) swap(b[j],b[j+1]); } } } void merge_arr(int lo,int mid,int hi) { int len = 0,i=lo,j=mid+1; while(i<=mid && j<=hi) { if(b[i]<=b[j]) c[len++]=b[i++]; else c[len++] = b[j++]; } while(i<=mid) c[len++] = b[i++]; while(j<=hi) c[len++] = b[j++]; for(i=0;i<len;i++) b[lo+i] = c[i]; } void merge_sort(int lo,int hi) { if(lo<hi) { int mid = (lo+hi)>>1; merge_sort(lo,mid); merge_sort(mid+1,hi); merge_arr(lo,mid,hi); } } void quick_sort(int lo,int hi) { if(lo<hi) { int x=b[lo],i=lo,j=hi; while(i<j) { while(i<j && b[j]>=x) j--; if(i<j) { b[i] = b[j]; i++; } while(i<j && b[i]<x) i++; if(i<j) { b[j] = b[i]; j--; } } b[i] = x; quick_sort(lo,i); quick_sort(i+1,hi); } } void showa() { int i; for(i = 0;i<n;i++) printf("%d ",a[i]); printf(" "); } void showb() { int i; for(i = 0;i<n;i++) printf("%d ",b[i]); printf(" "); } LL getCurrentTime() { /* struct timeval tv; gettimeofday(&tv,NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; */ DWORD start; start = GetTickCount(); //printf("time %d ",start); return start; } int main() { int i,j,k,t; LL t1,t2; double tsum,tsum2,tsum3,tsum4,tsum5,sum=0,sum2=0,sum3=0,sum4=0,sum5=0; while(~scanf("%d",&n) && n) { printf("数据规模:%d 20组样本时间(ms): ",n); printf("插入 "); srand(unsigned(time(0))); for(j=1;j<=G;j++) { tsum=tsum2=tsum3=tsum4=tsum5=0; for(i = 0;i<n;i++) a[i] = rand()%1000000; //show(); for(k=0;k<T;k++) { for(i = 0;i<n;i++) b[i] = a[i]; //showb(); t1 = getCurrentTime(); insert_sort(); t2 = getCurrentTime(); tsum+=(t2-t1); //showb(); //printf(" "); } //show(); sum+=tsum/T; printf("%.2lf ",tsum/T); } printf("平均时间: "); printf("%lf ",sum/20); } return 0; }