原贴地址:http://blog.csdn.net/feixiaoxing/article/details/6974826
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面说到,克鲁斯卡尔的算法是按照各个line的权重依次进行添加的,那么这就涉及到一个权重的排序问题。怎么排序呢?可以采用最简单的冒泡排序算法。可是这里排序的是数据结构,怎么办呢?那就只好采用通用排序算法了。
- void bubble_sort(void* array[], int length, int (*compare)(void*, void*), void(*swap)(void**, void**))
- {
- int outer;
- int inner;
- for(outer = length -1; outer >0; outer --){
- for(inner = 0; inner < outer; inner ++){
- if(compare(array[inner], array[inner + 1]))
- swap(&array[inner], &array[inner + 1]);
- }
- }
- return;
- }
- int compare(void* data1, void* data2)
- {
- DIR_LINE* line1 = (DIR_LINE*) data1;
- DIR_LINE* line2 = (DIR_LINE*) data2;
- return (line1->weight > line2->weight) ? 1 : 0;
- }
- void swap(void** data1, void** data2)
- {
- DIR_LINE* median;
- DIR_LINE** line1;
- DIR_LINE** line2;
- line1 = (DIR_LINE**) data1;
- line2 = (DIR_LINE**) data2;
- median = *line1;
- *line1 = *line2;
- *line2 = median;
- }
- int getVectexNumFromTree(MINI_GENERATE_TREE* pTree, int start, int end)
- {
- int index;
- int total;
- total = 0;
- for(index = 0; index < pTree->node_num; index++){
- if(start == pTree->pNode[index]){
- total ++;
- continue;
- }
- if(end == pTree->pNode[index]){
- total ++;
- }
- }
- return total;
- }
- int isDoubleVectexExistInTree(MINI_GENERATE_TREE* pTree[], int length, int start, int end)
- {
- int index = 0;
- int value = 0;
- int number = 0;
- for(index = 0; index < length; index ++){
- number = getVectexNumFromTree(pTree[index], start, end);
- if(number > value)
- value = number;
- }
- return (value == 2) ? 1 : 0;
- }
- void mergeTwoMiniGenerateTree(MINI_GENERATE_TREE* pTree[], int length, int start, int end, int weight)
- {
- MINI_GENERATE_TREE* pFirst;
- MINI_GENERATE_TREE* pSec;
- DIR_LINE* line;
- int index;
- /* 删除多余的最小生成树 */
- pFirst = find_tree_by_index(pTree, length, start);
- pSec = find_tree_by_index(pTree, length, end);
- delete_mini_tree_from_group(pTree, length, pSec);
- /* 合并节点 */
- for(index = 0; index < pSec->node_num; index ++){
- pFirst->pNode[pFirst->node_num + index] = pSec->pNode[index];
- }
- pFirst->node_num += pSec->node_num;
- /* 合并线段 */
- for(line = pSec->pLine; line; line = line->next){
- insert_line_into_queue(&pFirst->pLine, line->start, line->end, line->weight);
- }
- insert_line_into_queue(&pFirst->pLine, start, end, weight);
- /* 函数返回 */
- return;
- }
文章总结:
(1)本篇主要介绍了克鲁斯卡尔算法编写中需要处理的三个问题,排序、查找和合并
(2)复杂的函数都是由简单的函数构造而成的,我们可以把算法分成几个独立的部分,各个击破
(3)解决了这三个问题,下一篇博客就可以进行归总分析处理,逻辑上也十分清晰了
【未完,待续】