2013-12-15 3 views
0

코스의 짧은 프로젝트에 대한 최소 스패닝 트리의 Prim 's Algorithm을 구현할 프로그램을 작성하고 있습니다. 첫 번째 단계는 무게에 따라 가장자리를 정렬하는 것입니다. 이 코드는 때때로 작동하지만 항상 그런 것은 아닙니다. 여기 큰 배열의 정렬 함수가 실패했습니다

코드이다

for(int i = 0; i < graph.edges; ++i) 
{ 
    least_remain_edge = i; 

    for(int k=i+1; k<graph.edges; ++k) 
    { 
     if(graph.edge[k][3]<graph.edge[least_remain_edge][3]) 
     { 
      least_remain_edge = k; 
     } 
    } 

    if(least_remain_edge != i) 
    { 
     swap_temp = graph.edge[i][0]; 
     graph.edge[i][0] = graph.edge[least_remain_edge][0]; 
     graph.edge[least_remain_edge][0] = swap_temp; 
    } 
} 

graph.edge[i][3]i 번째 에지의 weight이며 [i][0]는 에지 기준/이름이다. 이것은 버블 정렬과 같은 것으로, 목록의 나머지 부분에서 가장 작은 것을 찾은 다음 i 번째 자리에 배치합니다. 왜 이것이 항상 작동하지 않는지 나는 알 수 없다!

+0

어떻게 작동하지 않습니까? 그것은 잘못 정렬합니까, 아니면 오류가 발생합니까? – Xymostech

+0

제대로 정렬되지 않습니다. 사실, 정말로 나쁘지. [3,4,1,3]을 가져다가 [1,3,4,3] – FireGarden

답변

2

요소를 이동할 때, 가중치와 다른 것을 저장하는 것이 아니라 이름/참조 만 이동합니다. 그럼, 아마도 뭔가를 할

for (int k = 0; k < 4; k++) { 
    swap_temp = graph.edge[i][k]; 
    graph.edge[i][k] = graph.edge[least_remain_edge][k]; 
    graph.edge[least_remain_edge][k] = swap_temp; 
} 
+0

을 돌려주었습니다. 문제를 해결하지 못했습니다 : /. 나는 더 긴 가장자리 목록을 시도했고, 그것은 [1,3,5,4,2,2,4,3,5]를 가져 와서 [1,2,3,5,4,2,3,5, 4]! – FireGarden

+0

@FireGarden 그러면 코드를 더 보여줘야합니다. 나는 이것을 여기에 구현했다 (http://ideone.com/4TVfTZ). 그래서 뭔가 잘못되어 가고 있습니다. – Xymostech

+0

시도해 줘서 고마워 - 나는 더 잔인한별로 좋지 않은 정렬 기능을 사용하여 문제를 피했지만 작동했다. – FireGarden