void ex_quick_sort(TYPE* data, size_t size) {
    TYPE  m;
    TYPE *l, *r, *e;
    if (size <= 32) {
        if (size <= 1)
            return;
        insert_sort(data, size);
        return;
    }
    m = data[size / 2];
    l = data;
    e = data + size;
    r = e - 1;
    for (;;) {
        while (*l < m)
            ++l;
        while (m < *r)
            --r;
        if (l >= r)
            break;
        swap(*l, *r);
        ++l;
    }
    ex_quick_sort(data, l - data);
    ex_quick_sort(l   , e - l  );
}