Как отсортировать массив от наименьшего элемента к самому большому (например, от 1 до 10) и показать количество итераций и количество сравнений - PullRequest
0 голосов
/ 16 апреля 2020

Итак, у меня есть этот код, который сортирует массив по 5 методам: пузырьковая сортировка, вставка, оболочка, быстрая сортировка и выделение. Мне также нужно отсортировать массив от наименьшего элемента к самому большому (например, от 1 до 10) и показать количество итераций и количество сравнений, но я не могу найти способ сделать это.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int a[10000],b[10000];
long int c[5],k;
float d[5];

float B(int t)
{
    clock_t me,ti;
    int aux,i,j;
    float w;
    me=clock();

    for(i=1;i<t;i++)
        for(j=i;j>0;j--)
        if(a[j]<a[j-1])
        {
            aux=a[j];
            a[j]=a[j-1];
            a[j-1]=aux;
            k++;
        }

    ti=clock();
    w=(float)(ti-me)/CLOCKS_PER_SEC;
    return w;
}

float I(int t)
{
    clock_t me,ti;
    int aux,i,j;
    float w;
    me=clock();

    for(i=0;i<t-1;i++)
        for(j=1;j<t-i;j++)
            if(a[i+j]<a[i])
            {
                aux=a[i];
                a[i]=a[i+j];
                a[i+j]=aux;
                k++;
            }

    ti=clock();
    w=(float)(ti-me)/CLOCKS_PER_SEC;
    return w;
}

float S(int t)
{
    clock_t me,ti;
    int i,j,min,lm;
    float w;
    me=clock();

    for(i=0;i<t-1;i++)
    {
        min=a[i];lm=i;
        for(j=i+1;j<t;j++)
            if(a[j]<min)
            {
                min=a[j];
                lm=j;
            }
            a[lm]=a[i];
            a[i]=min;
            k++;
    }

    ti=clock();
    w=(float)(ti-me)/CLOCKS_PER_SEC;
    return w;
}

float Sh(int t)
{
    clock_t me,ti;
    int aux,i,j,pas;
    float w;
    me=clock();

    for(pas=t/2;pas>0;pas/=2)
        for(i=pas;i<t;i++)
            for(j=i-pas;j>=0&&a[j]>a[j+pas];j-=pas)
            {
                aux=a[j];
                a[j]=a[j+pas];
                a[j+pas]=aux;
                k++;
            }

    ti=clock();
    w=(float)(ti-me)/CLOCKS_PER_SEC;
    return w;
}

void Q(int v,int t)
{
    int i,j;
    float aux,x;
    x=a[v];
    i=v;
    j=t;

    while(i<j)
    {
        while(a[i]<=x&&i<t)
            i++;
        while(a[j]>x)
            j--;
        if(i<j)
        {
            aux=a[i];
            a[i]=a[j];
            a[j]=aux;
            k++;
        }
    }

    if(j>v)
    {
        a[v]=a[j];
        a[j]=x;
        k++;
    }

    if(v<j-1)
        Q(v,j-1);
    if(t>j+1)
        Q(j+1,t);
}

int main()
{
    int al,i,n;
    clock_t me,ti;

    printf("Select array size...\n");
    printf("\t1. 100 elements.\n");
    printf("\t2. 1000 elements.\n");
    printf("\t3. 10000 elements.\n");
    printf("\t0. Close the programm.\n");
    printf("Your choise is ");
    scanf("%i",&al);

    switch(al)
    {
        case 1 :
            n=100;
            for(i=0;i<n;i++)
                a[i]=-99+rand()/(RAND_MAX/(99-(-99)+1)+1);

            printf("\nInitial array...\n");

            for(i=0;i<n;i++)
                printf("%4i ",a[i]);
            printf("\n");

            for(i=0;i<n;i++)
                b[i]=a[i];

            k=0;
            d[0]=B(n);
            c[0]=k;
            printf("\nArray sorted with bubblesort...\n");

            for(i=0;i<n;i++)
                printf("%4i ",a[i]);
            printf("\n\n");

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            d[1]=I(n);
            c[1]=k;

            printf("Array sorted with insertion...\n");
            for(i=0;i<n;i++)
                printf("%4i ",a[i]);
            printf("\n\n");

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            d[2]=S(n);
            c[2]=k;

            printf("Array sorted with selection...\n");
            for(i=0;i<n;i++)
                printf("%4i ",a[i]);
            printf("\n\n");

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            d[3]=Sh(n);
            c[3]=k;

            printf("Arrau sorted with shell...\n");
            for(i=0;i<n;i++)
                printf("%4i ",a[i]);
            printf("\n\n");

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            me=clock();
            Q(0,n-1);
            ti=clock();
            d[4]=(float)(ti-me)/CLOCKS_PER_SEC;
            c[4]=k;

            printf("Array sorted with quicksort...\n");
            for(i=0;i<n;i++)
                printf("%4i ",a[i]);
            printf("\n\n");

            printf("\t      Results...\n");
            printf("\t|=============|============|=================|\n");
            printf("\t|  Name       |   Time     | Nr of changes   |\n");
            printf("\t|=============|============|=================|\n");
            printf("\t| Bubble sort |  %f  |      %5li      |\n",d[0],c[0]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Insertion   |  %f  |      %5li      |\n",d[1],c[1]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Selection   |  %f  |      %5li      |\n",d[2],c[2]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t|   Shell     |  %f  |      %5li      |\n",d[3],c[3]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Quicksort   |  %f  |      %5li      |\n",d[4],c[4]);
            printf("\t|-------------|------------|-----------------|\n");
            break;

         case 2 :
            n=1000;

            for(i=0;i<n;i++)
                a[i]=-99+rand()/(RAND_MAX/(99-(-99)+1)+1);

            for(i=0;i<n;i++)
                b[i]=a[i];

            k=0;
            d[0]=B(n);
            c[0]=k;

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            d[1]=I(n);
            c[1]=k;

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            d[2]=S(n);
            c[2]=k;

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            d[3]=Sh(n);
            c[3]=k;

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            me=clock();
            Q(0,n-1);
            ti=clock();
            d[4]=(float)(ti-me)/CLOCKS_PER_SEC;
            c[4]=k;

            printf("\t      Results...\n");
            printf("\t|=============|============|=================|\n");
            printf("\t|  Name       |   Time     | Nr of changes   |\n");
            printf("\t|=============|============|=================|\n");
            printf("\t| Bubble sort |  %f  |      %7li      |\n",d[0],c[0]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Insertion   |  %f  |      %7li      |\n",d[1],c[1]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Selection   |  %f  |      %7li      |\n",d[2],c[2]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t|   Shell     |  %f  |      %7li      |\n",d[3],c[3]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Quicksort   |  %f  |      %7li      |\n",d[4],c[4]);
            printf("\t|-------------|------------|-----------------|\n");
            break;

         case 3 :
            n=10000;

            for(i=0;i<n;i++)
                a[i]=-99+rand()/(RAND_MAX/(99-(-99)+1)+1);
            for(i=0;i<n;i++) 
                b[i]=a[i];

            k=0;
            d[0]=B(n);
           c[0]=k;

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            d[1]=I(n);
            c[1]=k;

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            d[2]=S(n);
            c[2]=k;

            for(i=0;i<n;i++) 
                a[i]=b[i];

            k=0;
            d[3]=Sh(n);
            c[3]=k;

            for(i=0;i<n;i++)
                a[i]=b[i];

            k=0;
            me=clock();
            Q(0,n-1);
            ti=clock();
            d[4]=(float)(ti-me)/CLOCKS_PER_SEC;
            c[4]=k;

            printf("\t      Results...\n");
            printf("\t|=============|============|=================|\n");
            printf("\t|  Name       |   Time     | Nr of changes   |\n");
            printf("\t|=============|============|=================|\n");
            printf("\t| Bubble sort |  %f  |      %9li      |\n",d[0],c[0]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Insertion   |  %f  |      %9li      |\n",d[1],c[1]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Selection   |  %f  |      %9li      |\n",d[2],c[2]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t|   Shell     |  %f  |      %9li      |\n",d[3],c[3]);
            printf("\t|-------------|------------|-----------------|\n");
            printf("\t| Quicksort   |  %f  |      %9li      |\n",d[4],c[4]);
            printf("\t|-------------|------------|-----------------|\n");
            break;

        case 0:
            printf("\n!You closed the programm.\n");
            break;

        default:
            printf("\n!Error!\n");
            break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...