#include
#include
#include
const int maxx=20010;
int a[11][maxx];
void swap(int *x,int *y)
{
int z=*x;
*x=*y;
*y=z;
}
/*--------------插入排序--------------*/
void zjcrsort()//直接插入排序
{
int b[11][maxx];
for(int i=0;i<10;i++)
for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
for(int k=0;k<10;k++)
{
int begin=clock();
int cnt1=0,cnt2=0;//比较次数和移动次数
for(int i=1;i<20000;i++)
{
int j=i;
int temp=b[k][i];
while(j>0&&temp<b[k][j-1])//依次移动数组顺序
{
cnt1++,cnt2++;
b[k][j]=b[k][j-1];
j--;
}
b[k][j]=temp;
}
int end=clock();
printf("直接插入排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
}
}
/*------------希尔排序-------------*/
void shellsort()//希尔排序
{
int b[11][maxx];
for(int i=0;i<10;i++)
for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
for(int k=0;k<10;k++)
{
int begin=clock();
int cnt1=0,cnt2=0;//比较次数和移动次数
int gap;
for(gap=20000/2;gap>0;gap/=2)//每次的增量,递减趋势
{
for(int i=gap;i<20000;i++)//每次增量下,进行几组插入排序
{
for(int j=i;j-gap>=0&&b[k][j-gap]>b[k][j];j-=gap)//每个元素组中进行直接插入排序
{
swap(&b[k][j-gap], &b[k][j]);
cnt1++,cnt2++;//移动和比较次数加一
}
}
}
int end=clock();
printf("希尔排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
}
}
/*--------简单选择排序----------*/
void chocsort()//简单选择排序
{
int b[11][maxx];
for(int i=0;i<10;i++)
for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
for(int k=0;k<10;k++)
{
int begin=clock();
int cnt1=0,cnt2=0;//比较次数和移动次数
for(int i=0;i<200000-1;i++)
{
int _min=i;//记录最小元素位置
for(int j=i+1;j<20000;j++)
{
if(b[k][j]<b[k][_min])
{
cnt1++;_min=j;//更换最小元素位置
}
}
if(_min!=i)
{
cnt2++;
swap(&b[k][i],&b[k][_min]);//交换位置
}
}
int end=clock();
printf("简单选择排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
}
}
/*------冒泡排序-------*/
void mpsort()//冒泡排序
{
int b[11][maxx];
for(int i=0;i<10;i++)
for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
for(int k=0;k<10;k++)
{
int begin=clock();
int cnt1=0,cnt2=0;//比较次数和移动次数
for(int i=0;i<20000-1;i++)//排序的总轮数
{
for(int j=0;j<20000-1-i;j++)//每轮排序的个数
{
if(b[k][j]>b[k][j+1])
{
cnt1++;cnt2++;
swap(&b[k][j],&b[k][j+1]);
}
}
}
int end=clock();
printf("冒泡排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
}
}
/*--------快速排序---------*/
void quicksort(int l,int r,int *cnt1,int *cnt2,int xx[][maxx],int k)//快速排序函数
{
int i,j,t,temp;
if(l>r) return ;//不符合排序条件,直接返回
temp=xx[k][l];//temp中存的是基准数
i=l;j=r;
while(i!=j)
{
//先找右边的数字
while(xx[k][j]>=temp&&i<j) j--;
//再找左边的数字
while(xx[k][i]<=temp&&i<j) i++;
if(i<j) swap(&xx[k][i],&xx[k][j]);
}
xx[k][l]=xx[k][i];
xx[k][i]=temp;//最终将基准数归位
quicksort(l,i-1,cnt1,cnt2,xx,k);//继续处理左边的,这里是一个递归的过程
quicksort(i+1,r,cnt1,cnt2,xx,k);//继续处理右边的 ,这里是一个递归的过程
}
void Qsort()//快速排序
{
int b[11][maxx];
for(int i=0;i<10;i++)
for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
for(int k=0;k<10;k++)
{
int begin=clock();
int cnt1=0,cnt2=0;//比较次数和移动次数
quicksort(0,9999,&cnt1,&cnt2,b,k);
int end=clock();
printf("快速排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
}
}
/*------基数排序-------*/
int max(int date[],int n){//此函数用于求解所给数组中最大数有几位
int max=0;
for(int i=0;i<n;i++){
int count=1,tem=date[i];
while(tem/10!=0){//计算每个数的位数,用count计数
tem=tem/10;
count++;
}
if(count>max)
max=count;//把最大位数赋值max
}
return max;
}
void basesort(int date[],int n){
int max1=max(date,n);//取得最大位数
int num=1;
for(int i=0;i<max1;i++){//位数决定排序循环次数
int count[10];//声明count为了统计每个桶放了几个数
int temp[10][maxx];//temp相当于桶,前一个数标记第几个篮子,后一个为了标记放的个数
for(int f=0;f<10;f++){//对声明数组初始化
count[f]=0;
}
for(int g=0;g<10;g++){//对声明数组初始化
for(int z=0;z<n;z++){
temp[g][z]=0;
}
}
for(int j=0;j<n;j++){
int fg=date[j]/num;//num是变量,因为每次循环比较的位是不同的
int k=fg%10;
count[k]++;
int te=count[k]-1;
temp[k][te]=date[j];//把数据放k桶的te位上存储
}
int b=0;
for(int h=0;h<10;h++){
if(count[h]>0){//h>0说明h桶内有数字存储
for(int v=0;v<count[h];v++){//count[h]是h桶的存储个数
date[b]=temp[h][v];//把桶内排好的数全都倒给要排序的数组,进行下轮排序
b++;
}
}
}
num=num*10;
}
}
void Jssort()//基数排序
{
int b[maxx];
for(int k=0;k<10;k++)
{
for(int i=0;i<20000;i++) b[i]=a[k][i];
int begin=clock();
basesort(b,20000);
int end=clock();
printf("基数排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
}
}
/*---------归并排序---------*/
void merge_sort(int *list, int length)
{
int i, left_min, left_max, right_min, right_max, next;
int *tmp = (int*)malloc(sizeof(int) * length);
if (tmp == NULL)
{
fputs("Error: out of memory\n", stderr);
abort();
}
for (i = 1; i < length; i *= 2) // i为步长,1,2,4,8……
{
for (left_min = 0; left_min < length - i; left_min = right_max)
{
right_min = left_max = left_min + i;
right_max = left_max + i;
if (right_max > length)
right_max = length;
next = 0;
while (left_min < left_max && right_min < right_max)
tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++];
while (left_min < left_max)
list[--right_min] = list[--left_max];
while (next > 0)
list[--right_min] = tmp[--next];
}
}
free(tmp);
}
void Gbsort()//归并排序
{
int b[maxx];
for(int k=0;k<10;k++)
{
for(int i=0;i<20000;i++) b[i]=a[k][i];
int begin=clock();
merge_sort(b,20000);
int end=clock();
printf("归并排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
}
}
/*----------堆排序-----------*/
void heapAdjust(int *b,int s,int len)
{
int temp=b[s];
for(int j=2*s;j<=len;j*=2)
{
if(j<len && b[j]<b[j+1])
j++;
if(b[j]>temp)
{
b[s]=b[j];
s=j;
}
else
break;
}
b[s]=temp;
}
void heapSort(int *b,int len)
{
for(int i=len/2;i>=1;i--)
{
heapAdjust(b,i,len);
}
for(int i=len;i>1;i--)
{
swap(&b[1],&b[i]);
heapAdjust(b,1,i-1);
}
}
void Dsort()//堆排序
{
int b[maxx];
for(int k=0;k<10;k++)
{
for(int i=0;i<20000;i++) b[i+1]=a[k][i];
int begin=clock();
heapSort(b,20000);
int end=clock();
printf("堆排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
}
}
int main()
{
freopen("1.txt","r",stdin);//文件输入
for(int i=0;i<10;i++)
for(int j=0;j<20000;j++)
scanf("%d",&a[i][j]);
printf("文件读入完成\n");
printf("***直接插入排序***\n");zjcrsort();
printf("***希尔排序***\n");shellsort();
printf("***简单选择排序***\n");chocsort();
printf("***冒泡排序***\n");mpsort();
printf("***快速排序***\n");Qsort();
printf("***基数排序***\n");Jssort();
printf("***堆排序***\n");Dsort();
printf("***归并排序***\n");Gbsort();
return 0;
}
努力加油a啊,(o)/~