C 如何在图形的Kruskal函数上使用动态数据实现qsort
我创建了一个Kruskal函数,这样它就可以找到图上的最小路径。但我用冒泡排序,我正试图用qsort使它工作,并使我的结构动态,这样它可以让我更有效 所有使用的功能都在工作,但如果你有疑问,请问我,这样我就可以发布它。我使用union find作为PDCC分区来链接 我的代码是:C 如何在图形的Kruskal函数上使用动态数据实现qsort,c,algorithm,graph,kruskals-algorithm,C,Algorithm,Graph,Kruskals Algorithm,我创建了一个Kruskal函数,这样它就可以找到图上的最小路径。但我用冒泡排序,我正试图用qsort使它工作,并使我的结构动态,这样它可以让我更有效 所有使用的功能都在工作,但如果你有疑问,请问我,这样我就可以发布它。我使用union find作为PDCC分区来链接 我的代码是: struct _temp{ float weight; int source; int destination; }; typedef struct _temp Temp; struct _g
struct _temp{
float weight;
int source;
int destination;
};
typedef struct _temp Temp;
struct _graph{
int NumberVertex;
int NumberEdges;
float* NeighborMatrix;
};
typedef struct _graph Graph;
struct din_part{
int n;
int*v;
};
typedef struct din_part PartDin;
Graph* grKruskal(Graph* g)
{
Graph* tree_min = graph_Create(g->NumberVertex);
PartDin* p = pd_Create(g->NumberVertex);
int i, j,number_edges=0,n=0,representative;
Temp edges[300],temp;
for (i = 0; i < (g->NumberVertex); i++)
{
for (j = n; j < (g->NumberVertex); j++)
{
if(g->NeighborMatrix[g->NumberVertex * i + j]!=0)
{
edges[number_edges].weight=g->NeighborMatrix[g->NumberVertex * i + j];
edges[number_edges].source=i;
edges[number_edges].destination=j;
number_edges++;
}
}
n++;
}
if(number_edges>0){
for(i=0; i<number_edges; i++)
{
int change=0;
for(j=0 ;j<number_edges-1; j++)
{
if(edges[j].weight >edges[j+1].weight){ // blubble_sort
temp=edges[j];
edges[j]= edges[j+1];
edges[j+1]=temp;
change=1;
}
}
if(!change)
{
for(i=0;i<number_edges;i++)
{
if(pd_Representative(p,edges[i].source)!=pd_Representative(p,edges[i].destination))
{
representative=pd_Union(p,edges[i].source,edges[i].destination);
graph_InsertEdge(arvore_min,edges[i].source,edges[i].destination,edges[i].weight);
}
}
p=pd_Free (p);
return tree_min;
}
}
}
}
通过中提供的qsort函数,可以轻松地在C中使用快速排序。您不需要动态的数据结构,尽管它将帮助您的程序更加灵活 其签名如下:
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
base是要排序的向量
num是向量中的元素数
size是每个元素的大小,即从sizeof返回的元素
comparator是一个函数指针,指向一个函数,该函数接收两个空指针并返回一个int。如果第一个参数大于第二个参数,则该函数必须返回正数,否则返回负数,如果它们相等,则返回0
在您的例子中,您可以简单地将冒泡排序部分替换为
qsort((void*)edges, number_edges, sizeof edges[0], comparator);
并将比较器定义为
使结构动态化意味着什么?您可以从使代码更模块化开始,即使用函数。将所有内容都放在一个函数中肯定不是最简单的方法。例如,创建一个负责排序的新函数。
int edge_comparator(void *ptr1, void *ptr2){
Temp edge1 = *((Temp *)ptr1);
Temp edge2 = *((Temp *)ptr2);
return edge1.weight - edge2.weight;
}