在一个由n个元素组成的集合里,第i个顺序统计量(order statistic)是该集合中第i 小的元素。比如:在一组元素的集合中,最小值是第1个顺序统计量(i =1),而最大值是第n个顺序统计量(i=n)。
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- void swap(int *a, int *b)
- {
- int temp = *a;
- *a = *b;
- *b = temp;
- }
- int random_partition(int a[], int p, int r)
- {
- int i, j, x;
- srand((unsigned int)time(NULL));
- i = rand() % (r - p) + p; /* i belong to [p, r) */
- swap(&a[p], &a[i]);
- /* general partition */
- i = p;
- x = a[p];
- for (j = p + 1; j < r; j++) {
- if (a[j] <= x) {
- i++;
- swap(&a[i], &a[j]);
- }
- }
- swap(&a[p], &a[i]);
- return i;
- }
- int find_ith(int a[], int p, int r, int i)
- {
- int k, q;
- if (p == r)
- return a[p];
- q = random_partition(a, p, r);
- k = q - p + 1;
- if (i == k)
- return a[q];
- else if (i < k)
- return find_ith(a, p, q, i);/* look for in a[p, q) */
- else
- return find_ith(a, q + 1, r, i - k);/* look for in a[q+1, r) */
- }
- main()
- {
- int a[] = {17, 29, 36, 78, 25, 46, 31, 25, 86};
- int size = sizeof(a) / sizeof(int);
- int num = find_ith(a, 0, size, 3);
- printf("%d", num);
- }