c - time.h 和文件中的算法 C 代码

标签 c algorithm file sorting time

我的大学有一个项目。在这个项目中,我必须用C语言编写一个程序,用于对一个巨大的表(30000个整数)进行排序,使用一些排序方法,如冒泡、快速、直插入和直选择。输出中应该包含每种排序方法的更改次数以及完成所需的时间。我有两个问题:

  1. 我无法显示所需的时间
  2. 我必须将输出重定向到文件,但我不知道如何实现。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 300

int getUniqueNumber(int p[N],int i);


int StraightInsertion(int p[]);
int StraightSelection(int p[]);
int  BubbleSort(int p[]);
int quicksort(int left, int right, int p[]);

int main(int argc, char *argv[])
{
    FILE *f;
    int c,p[N],p2[N];
    int i,b;
    int t0,t1,dt;
    int s=0;

    do{
        for (i=0;i<N;i++)
            p2[i]=getUniqueNumber(p2,i);

        for(i=0;i<N;i++)
            p[i]=p2[i];

        printf("\nTable after sorts:\n");
        printf("\n\n\n");
        printf("straight selection %d\n",s+1);
        time(&t0);
        c=StraightSelection(p);
        time(&t1);
        dt=t1-t0;
        printf("\n Number of changes: %d\n",c);
        printf(" Processing time: %d\n",dt);


// straight insertion table


        for(i=0;i<N;i++)
            p[i]=p2[i];
        printf("\n\n\n");
        printf("straight isertion %d\n",s+1);
        time(&t0);
        c=StraightInsertion(p);
        time(&t1);
        printf("\n number of changes: %d",c);
        dt=t1-t0;
        printf(" Processing time = %f\n",dt);

// Bubble Sort table


        for(i=0;i<N;i++)
            p[i]=p2[i];

        printf("\n\n\n");
        printf("Bubble sort %d\n",s+1);
        time(&t0);
        c=BubbleSort(p);
        time(&t1);
        printf("\n Number of changes: %d\n",c);
        dt=t1-t0;
        printf(" Processing time = %f\n",dt);

//  Quick Sort table


        for(i=0;i<N;i++)
            p[i]=p2[i];

        printf("\n\n\n");
        printf("Quick sort %d",s+1);
        time(&t0);
        c=quicksort(0,N-1,p);
        time(&t1);
        dt=t0-t1;
        printf("\n Number of changes: %d\n",c);
        printf(" Processing time = %f\n",dt);
        s++;
    }

    while(s<20);
    return 0;

}


int getUniqueNumber(int p[N],int i)
{
    int x,j, found;

    srand(time(NULL));
    do
    {
        x = rand();
        found = 0;
        j = 0;
        while (j<=i && found == 0)
        {
            if (p[j] == x)
                found = 1;
            else
                j++;
        }
    }while (found == 1);
    return x;
}



// STRAIGHT SELECTION
int StraightSelection(int p[])
{
    int i,j,k,min=0,a[N];
    int count=0;

    for (i=0; i<N-1; i++)
    {
        k = i;
        min = p[i];
        for (j = i+1; j<N; j++)
        {
            if (p[j] < min)
            {
                k = j;
                min = p[j];
                count ++;

            }
        }
        p[k] = p[i] ;
        p[i] = min;
    }

    return count;
}




//Straight Insertion
int StraightInsertion(int p[])
{

    int i,j,x;
    int count=0;

    for(i=1; i<N; i++)
    {
        x = p[i];
        j = i -1;
        while(x<p[j] && j>=0)
        {
            p[j+1] = p[j];
            j = j-1;
            count ++;
        }
        p[j+1] = x;
    }
    return count;
}


//Bubble Sort
int  BubbleSort(int p[])
{
    int i,j,temp;
    int count;

    for (i=1; i<N; i++)
        for (j=N-1; j>=i; j--)
            if (p[j-1] > p[j])
            {
                temp = p[j-1];
                p[j-1] = p[j] ;
                p[j] = temp ;
                count ++;
            }
    return count;
}


//Quick Sort
int quicksort(int left, int right, int p[])
{
    int i, j, mid, x, temp;
    int count=0;

    if (left < right)
    {
        i = left;
        j = right;
        mid = (left+right)/2;
        x = p[mid];
        while (i < j)
        {
            while (p[i] < x)
                i++;
            while (p[j] > x)
                j--;
            if (i < j)
            {
                if (p[i] == p[j])
                {
                    if (i<mid)
                        i++;
                    if (j>mid)
                        j--;
                }
                else
                {
                    temp = p[i];
                    p[i] = p[j];
                    p[j] = temp;
                }
                count ++;
            }
        }
        quicksort(left,j-1,p);
        quicksort(j+1,right,p);
    }

    return count;
}

最佳答案

bash 中的输出重定向可以通过 > 来完成。

例如,如果您想将 myprog 的输出重定向到文件 myout,您可以使用:

./myprog >myout

要计算程序执行的时间,您可以使用time命令,如下所示:

time ./myprog

它将计算从程序启动到退出所花费的总时间(通常称为挂钟时间)、在用户空间代码中花费的时间以及执行内核所花费的时间代码(例如,执行系统调用,作为打印输出的一部分)。

因此,要为程序计时并将输出重定向到文件,您可以这样做:

time ./myprog >myout

正如其他人在评论中提到的,这些都是相对简单的任务,您可能会在几秒钟内找到这些信息。请确保在发布新问题之前先进行一些研究。祝您的项目顺利!

注意:当然,这假设您对每种排序算法都有不同的程序。如果您宁愿坚持使用单个可执行文件,我建议您查看 Execution time of C program了解如何计算每个函数的执行时间。

关于c - time.h 和文件中的算法 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30013642/

相关文章:

c# - 遍历任意维度的数组

algorithm - 不知道限制 sin(x) 公式循环

file - 多个磁盘读/写操作会导致瓶颈?

C 计算文件中数字和字母的数量

python - 将文本中的键值对解析为字典

最终赋值的 C 循环优化帮助(禁用编译器优化)

c - 为什么 FormatMessage() 无法找到 WinINet 错误消息?

c - 正确使用 malloc()

c++ - 包含 malloc 声明的头文件的名称是什么?

python - 在输入中找到相同的数字并对成对的数字求和