Performance 排序太慢
因此,我正在为我的编程语言类做一个项目,我必须创建一个结构,对它进行排序,然后显示它所需的时间,问题是气泡排序(案例1)需要60秒,插入(案例2)需要5秒,选择(案例4)需要10秒。所有这些都包含100000个元素。shell只取0.03,所以我开始认为我的算法可能有问题。有人能帮我吗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
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为什么会存在其他排序?这就是为什么我认为我的代码中有一些错误。正如我在回答中所写,您的冒泡排序实现缺少优化。此外,您似乎正在复制字符串内容,而不仅仅是交换指针,这可能会使您的代码速度慢于必要的速度。已将此添加到回答中(无法在注释中设置格式)