int *klargest(int list[], int n, int k) { int i, last; if (n == k) return list+n; last = 0; for (i = 1; i < n; i++) if (list[i] > list[0]) swap(&list[++last], &list[i]); swap(&list[last], &list[0]); if (k <= last + 1) return klargest(list, last+1, k); else return klargest(list+last+1, n-last-1, k-last-1); }
void test_klargest() { int list[][5] = { {1, 2, 3, 4, 5}, {2, 4, 3, 5, 1}, {1, 2, 5, 4, 3}, {5, 4, 3, 2, 1}, {1, 1, 2, 2, 2}, {1, 1, 1, 1, 1} }; int list0[] = {1}; int i, *p, *k; printf("test_klargest\n"); for (i = 0; i < 6; i++) { k = klargest(list[i], 5, 4); for (p = list[i]; p != k; p++) printf("%d ", *p); printf("\n"); } k = klargest(list0, 1, 1); for (p = list0; p != k; p++) printf("%d ", *p); printf("\n"); }
int main () { int arr[] = {2, 5, 7, 1, 8, 10, 14, 17, 20, 25, 40, 2, 3, 5, 200}; klargest (arr, sizeof(arr)/sizeof(arr[0]), 15); return 0; }