void edgeSort(Edge arr[], int left, int right) { int i = left, j = right; Edge tmp; string pivot = arr[(left + right) / 2].StartVertex; /* partition */ while (i <= j) { while (arr[i].StartVertex < pivot) i++; while (arr[j].StartVertex > pivot) j--; if (i <= j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }; /* recursion */ if (left < j) edgeSort(arr, left, j); if (i < right) edgeSort(arr, i, right); return; }
void edgeSort(int left, int right) { if (left >= right) return; srand(unsigned(time(NULL))); int n = rand()%(right - left + 1) + left; int temp = Edge[n].w; ED ttp = Edge[n]; Edge[n] = Edge[left]; int i = left + 1, j = right; while (i <= j) { while (Edge[i].w < temp && i <= right) i++; while (Edge[j].w > temp && j >= left + 1) j--; if (i <= j) { ED tp = Edge[i]; Edge[i++] = Edge[j]; Edge[j--] = tp; } } if (j >= 0) { Edge[left] = Edge[j]; Edge[j] = ttp; } edgeSort(left, j - 1); edgeSort(j + 1, right); return; }
void edgeArrayInit(Edge RBM[], int num_edges){ for(int i = 0; i < num_edges; i++) { string garbage; getline(cin, RBM[i].StartVertex, ',');//that is a comma getline(cin, RBM[i].EndVertex, ',');//also a comma cin >> RBM[i].Dweight; getline(cin, garbage); } edgeSort(RBM, 0, num_edges); return; }
void Kruskal(int n) { edgeSort(0, n); //for (int i = 0; i <= n; i++) //std::cout << Edge[i].w << " " << Edge[i].x << " " << Edge[i].y << std::endl; int m = 0, sum_w = 0; while (m < n) { /////////////////////////////////////////////////////// if (!Is_same(Edge[m].x, Edge[m].y)) { sum_w += Edge[m].w; std::cout << Edge[m].x << " " << Edge[m].y << std::endl; Union(Edge[m].x, Edge[m].y); } m++; } std::cout << "sum_w = " << sum_w << std::endl; }