Ejemplo n.º 1
0
    ListNode* divide_conquer(vector<ListNode*>& lists, int i, int j) {
        // base case: only one or two lists left
        if (i == j)
            return lists[i];
        if (i + 1 == j)
            return merge2Lists(lists[i], lists[j]);

        // Recursive: partion into two parts, [i, mid] and [mid+1, j]
        // sort each part with divide_conquer(), and then merge them
        int mid = i + (j - i) / 2;
        return merge2Lists(divide_conquer(lists, i, mid), divide_conquer(lists, mid + 1, j));
    }
Ejemplo n.º 2
0
struct PointArray* closest_pair(char *filename){
    struct Connection *conn = File_open(filename, "rt");
    struct PointArray *point_array = Connection_process(conn);
    Connection_close(conn);
    struct PointArraySplitted *split_array = split_point_array(point_array);

    struct OrderedPointArray *ordered1 = malloc(sizeof(struct OrderedPointArray));
    ordered1->x_ordered = split_array->array1;
    ordered1->y_ordered = split_array->array1;

    struct OrderedPointArray *ordered2 = malloc(sizeof(struct OrderedPointArray));
    ordered2->x_ordered = split_array->array2;
    ordered2->y_ordered = split_array->array2;

    struct PointArray *result;
    struct OrderedPointArray *result1 = split_sort(ordered1);
    struct OrderedPointArray *result2 = split_sort(ordered2);

    struct OrderedPointArray *result_merged = merge_point_array(result1, result2);
    divide_conquer(result_merged->x_ordered, result_merged->y_ordered);

    return result;
}
Ejemplo n.º 3
0
 ListNode* mergeKLists(vector<ListNode*>& lists) {
     if (lists.empty()) return NULL;
     return divide_conquer(lists, 0, lists.size() - 1);
 }