Esempio n. 1
0
void shellsort(void  *base,
           size_t nel)
{
	size_t wgap, i, j, k;
    const size_t width = sizeof(Element);
	char tmp;

	if ((nel > 1) && (width > 0)) {
		assert(nel <= ((size_t)(-1)) / width); /* check for overflow */
		wgap = 0;
		do {
			wgap = 3 * wgap + 1;
		} while (wgap < (nel-1)/3);
		/* From the above, we know that either wgap == 1 < nel or */
		/* ((wgap-1)/3 < (int) ((nel-1)/3) <= (nel-1)/3 ==> wgap <  nel. */
		wgap *= width;			/* So this can not overflow if wnel doesn't. */
		nel *= width;			/* Convert nel to 'wnel' */
		do {
			i = wgap;
			do {
				j = i;
				do {
					register char *a;
					register char *b;

					j -= wgap;
					a = j + ((char *)base);
					b = a + wgap;
					if (sort_comparator(a, b) <= 0) {
						break;
					}
					k = width;
					do {
						tmp = *a;
						*a++ = *b;
						*b++ = tmp;
					} while (--k);
				} while (j >= wgap);
				i += width;
			} while (i < nel);
			wgap = (wgap - width)/3;
		} while (wgap);
	}
}
vector<pair<DOMAIN_TYPE, DOMAIN_TYPE>> *map_aggregation::top_k(int k)
{
    vector<pair<DOMAIN_TYPE, DOMAIN_TYPE>> pairs;
    for (auto iter = data.begin(); iter != data.end(); ++iter)
    {
        pairs.push_back(*iter);
    }
    
    sort(pairs.begin(), pairs.end(), sort_comparator());
    
    vector<pair<DOMAIN_TYPE, DOMAIN_TYPE>> *result = new vector<pair<DOMAIN_TYPE, DOMAIN_TYPE>>();
    
    for (int i = 0; i < min(k, pairs.size()); ++i)
    {
        result->push_back(pairs[i]);
    }
    
    return result;
}