排序作业

 

 

#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("\n");
}

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\n20组样本时间(ms):\n",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("\n");
        }
    }

    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("\n");
}

void showb()
{
    int i;
    for(i = 0;i<n;i++) printf("%d ",b[i]);
    printf("\n");
}

LL getCurrentTime()//计算算法执行时间
{
   /*
   struct timeval tv;
   gettimeofday(&tv,NULL);
   return tv.tv_sec * 1000 + tv.tv_usec / 1000;
   */
   DWORD start;
   start = GetTickCount();
   //printf("time %d\n",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\n20组样本时间(ms):\n",n);
        printf("选择\t\t插入\t\t归并\t\t冒泡\t\t快速\n");
        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("\n");

                for(i = 0;i<n;i++) b[i] = a[i];
                //showb();
                t1 = getCurrentTime();
                insert_sort();
                t2 = getCurrentTime();
                tsum2+=(t2-t1);
                //showb();
                //printf("\n");

                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("\n");

                for(i = 0;i<n;i++) b[i] = a[i];
                //showb();
                t1 = getCurrentTime();
                bubble_sort();
                t2 = getCurrentTime();
                tsum4+=(t2-t1);
                //showb();
                //printf("\n");

                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("\n");
            }
            //show();
            sum+=tsum/T;sum2+=tsum2/T;sum3+=tsum3/T;sum4+=tsum4/T;sum5+=tsum5/T;
            printf("%lf\t%lf\t%lf\t%lf\t%lf\n",tsum/T,tsum2/T,tsum3/T,tsum4/T,tsum5/T);
        }
        printf("平均时间:\n");
        printf("%lf\t%lf\t%lf\t%lf\t%lf\n",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("\n");
}

void showb()
{
    int i;
    for(i = 0;i<n;i++) printf("%d ",b[i]);
    printf("\n");
}

LL getCurrentTime()
{
   /*
   struct timeval tv;
   gettimeofday(&tv,NULL);
   return tv.tv_sec * 1000 + tv.tv_usec / 1000;
   */
   DWORD start;
   start = GetTickCount();
   //printf("time %d\n",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\n20组样本时间(ms):\n",n);
        printf("插入\n");
        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("\n");
            }
            //show();
            sum+=tsum/T;
            printf("%.2lf\n",tsum/T);
        }
        printf("平均时间:\n");
        printf("%lf\n",sum/20);
    }

    return 0;
}

 

posted @ 2016-09-12 16:00  qlky  阅读(170)  评论(0编辑  收藏  举报