Performance 排序太慢

Performance 排序太慢,performance,bubble-sort,insertion-sort,selection-sort,shellsort,Performance,Bubble Sort,Insertion Sort,Selection Sort,Shellsort,因此,我正在为我的编程语言类做一个项目,我必须创建一个结构,对它进行排序,然后显示它所需的时间,问题是气泡排序(案例1)需要60秒,插入(案例2)需要5秒,选择(案例4)需要10秒。所有这些都包含100000个元素。shell只取0.03,所以我开始认为我的算法可能有问题。有人能帮我吗 void ordenesc(compleja * vd, int tam) { int i=0,j=0,k=0,aux=0,op=0,inc=0,minimo=0; char auxcad

因此,我正在为我的编程语言类做一个项目,我必须创建一个结构,对它进行排序,然后显示它所需的时间,问题是气泡排序(案例1)需要60秒,插入(案例2)需要5秒,选择(案例4)需要10秒。所有这些都包含100000个元素。shell只取0.03,所以我开始认为我的算法可能有问题。有人能帮我吗

void ordenesc(compleja * vd, int tam)
    {
    int i=0,j=0,k=0,aux=0,op=0,inc=0,minimo=0;
    char auxcad[20];
    clock_t start, end;
    double tiempo;

    op=menus(3);
    start = clock();
    switch(op)
    {
        case 1://Burbujeo
            for(i=1;i<=tam;i++)
            {
                for(j=0;j<tam-1;j++)
                {
                    if(vd[j].nro>vd[j+1].nro)
                    {
                        aux=vd[j].nro;
                        vd[j].nro=vd[j+1].nro;
                        vd[j+1].nro=aux;
                        strcpy(auxcad,vd[j].cad);
                        strcpy(vd[j].cad,vd[j+1].cad);
                        strcpy(vd[j+1].cad,auxcad);
                    }

                }
            }
            break;

        case 2://Inserccion
            for(i = 1; i < tam; i++)
            {
                aux=vd[i].nro;
                strcpy(auxcad,vd[i].cad);
                for (j = i - 1; j >= 0 && vd[j].nro > aux; j--)
                {
                    vd[j+1].nro=vd[j].nro;
                    strcpy(vd[j+1].cad,vd[j].cad);
                    j--;
                }
                    vd[j+1].nro=aux;
                    strcpy(vd[j+1].cad,auxcad);
            }
            break;
                    case 3://Shell
                inc=(tam/2);
                while (inc > 0)
                {
                    for (i=0; i < tam; i++)
                    {
                      j = i;
                      aux = vd[i].nro;
                      strcpy(auxcad,vd[i].cad);
                      while ((j >= inc) && (vd[j-inc].nro > aux))
                      {
                        vd[j].nro = vd[j - inc].nro;
                        strcpy(vd[j].cad,vd[j-inc].cad);
                        j = j - inc;
                      }
                    vd[j].nro = aux;
                    strcpy(vd[j].cad,auxcad);
                    }
                    if (inc == 2)
                        inc = 1;
                    else
                        inc = inc * 5 / 11;
                  }
                break;
        case 4://Seleccion
            for(i=0;i<tam-1;i++)
            {
                minimo=i;
                for(j=i+1;j<tam;j++)
                {
                    if(vd[minimo].nro > vd[j].nro) minimo=j;
                }
                aux=vd[minimo].nro;
                vd[minimo].nro=vd[i].nro;
                vd[i].nro=aux;
                strcpy(auxcad,vd[minimo].cad);
                strcpy(vd[minimo].cad,vd[i].cad);
                strcpy(vd[i].cad,auxcad);
            }
            break;

        case 9:
            break;

        default:
            break;
        }
    end = clock();
    tiempo = ((double) (end - start)) / CLOCKS_PER_SEC;
    //system("cls");
    i=0;
    for(i=0;i<tam;i++){
    printf("%d   %s \n",vd[i].nro,vd[i].cad);}
    printf("\n Tardo %f segundos \n", tiempo);
    return;
}
void ordenesc(compleja*vd,inttam)
{
int i=0,j=0,k=0,aux=0,op=0,inc=0,minimo=0;
char-auxcad[20];
时钟开始、结束;
双蒂恩波;
op=菜单(3);
开始=时钟();
开关(op)
{
案例1://Burbujeo
对于(i=1;i=0&&vd[j].nro>aux;j--)
{
vd[j+1].nro=vd[j].nro;
strcpy(vd[j+1].cad,vd[j].cad);
j--;
}
vd[j+1].nro=aux;
strcpy(vd[j+1].cad,auxcad);
}
打破
案例3://壳牌
inc=(tam/2);
而(inc>0)
{
对于(i=0;i=inc)和&(vd[j-inc].nro>aux))
{
vd[j].nro=vd[j-inc].nro;
strcpy(vd[j].cad,vd[j-inc].cad);
j=j-inc;
}
vd[j].nro=aux;
strcpy(vd[j].计算机辅助设计,auxcad);
}
如果(inc==2)
inc=1;
其他的
inc=inc*5/11;
}
打破
案例4://选择

对于(i=0;i为了确保排序算法按预期工作,您可以在最后一个循环中添加一个检查,以确保打印元素时元素的实际顺序。相对而言,算法中不太可能存在根本性错误,并且排序仍然正确

这个练习的一点可能是要表明排序算法确实很重要,而选择排序是唯一比列表中的O(n^2)性能更好的算法。因此,我不会对性能上的巨大差异感到太惊讶

可以对冒泡排序进行的一个改进是,您只需要在内部循环中迭代i元素(而不是tam),因为i最大的元素将在内部循环中一直冒泡

另一个改进可能是只复制指针而不是字符数组的内容,例如

而不是

 char auxcad[20];

 ...

 strcpy(auxcad, vd[j].cad);
 strcpy(vd[j].cad, vd[j+1].cad);
 strcpy(vd[j+1].cad, auxcad);
你可能想写信

 char* auxcad;

 ...

 auxcad = vd[j].cad;
 vd[j].cad = vd[j+1].cad;
 vd[j+1].cad = auxcad;

但是计时不好shell的速度快了一个x100%的百分比,我有一个打印如果它们都被正确排序了你对100000个元素进行了排序。“不好”算法的复杂度为O(n^2),因此需要1000000000个操作。shell排序更接近O(n log n)我想,这将是500000。所以听起来都是合法的。我认为选择这个问题是为了说明差别有多大。shell排序比其他的好吗?一些朋友告诉我,气泡排序不应该花费30秒完成。如果shell在1000、10000和10上更好,我不认为让我这样做有什么意义0000为什么会存在其他排序?这就是为什么我认为我的代码中有一些错误。正如我在回答中所写,您的冒泡排序实现缺少优化。此外,您似乎正在复制字符串内容,而不仅仅是交换指针,这可能会使您的代码速度慢于必要的速度。已将此添加到回答中(无法在注释中设置格式)