期望线性时间选择

在一个由n个元素组成的集合里,第i个顺序统计量(order statistic)是该集合中第i 小的元素。比如:在一组元素的集合中,最小值是第1个顺序统计量(i =1),而最大值是第n个顺序统计量(i=n)。

Code:
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <time.h>  
  4.   
  5. void swap(int *a, int *b)  
  6. {  
  7.     int temp = *a;  
  8.     *a = *b;  
  9.     *b = temp;  
  10. }  
  11.   
  12. int random_partition(int a[], int p, int r)  
  13. {  
  14.     int i, j, x;  
  15.   
  16.     srand((unsigned int)time(NULL));  
  17.     i = rand() % (r - p) + p; /* i belong to [p, r) */  
  18.     swap(&a[p], &a[i]);  
  19.   
  20.     /* general partition */  
  21.     i = p;  
  22.     x = a[p];  
  23.     for (j = p + 1; j < r; j++) {  
  24.         if (a[j] <= x) {  
  25.             i++;  
  26.             swap(&a[i], &a[j]);  
  27.         }  
  28.     }  
  29.     swap(&a[p], &a[i]);  
  30.     return i;  
  31. }  
  32.   
  33. int find_ith(int a[], int p, int r, int i)  
  34. {  
  35.     int k, q;  
  36.     if (p == r)  
  37.         return a[p];  
  38.       
  39.     q = random_partition(a, p, r);  
  40.     k = q - p + 1;  
  41.     if (i == k)  
  42.         return a[q];  
  43.     else if (i < k)  
  44.         return find_ith(a, p, q, i);/* look for in a[p, q) */  
  45.     else  
  46.         return find_ith(a, q + 1, r, i - k);/* look for in a[q+1, r) */  
  47. }  
  48.   
  49. main()  
  50. {  
  51.     int a[] = {17, 29, 36, 78, 25, 46, 31, 25, 86};  
  52.     int size = sizeof(a) / sizeof(int);  
  53.     int num = find_ith(a, 0, size, 3);  
  54.       
  55.     printf("%d", num);  
  56. }  

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值