PKU 2388 Who's in the Middle

PKU 2388 Who's in the Middle

问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=2388

思路:
1. 排序
这题直接用快排就能AC,很水...

2. 求解第i个顺序统计量(详见CLRS)
   利用快速排序过程中的思路,期望时间复杂度是O(n)

   ps: partition函数的执行过程是比较有意思的呵呵
 1  int  
 2  partition( long   * arr,  int  begin,  int  end)
 3  {
 4       int  i, j;
 5      i  =  begin;
 6       long  pivot  =  arr[begin];
 7       for (j = begin + 1 ; j <= end; j ++ )
 8           if (arr[j]  <=  pivot)
 9              swap(arr,  ++ i, j);
10      swap(arr, i, begin);
11       return  i;
12  }
13 
14  long
15  find_ith_os( long   * arr,  int  begin,  int  end,  int  ith)
16  {
17       if (begin  ==  end)
18           return  arr[begin];
19       int  p  =  partition(arr, begin, end);
20       int  k  =  p - begin + 1 ;
21       if (k  ==  ith)
22           return  arr[p];
23       else   if (ith  <  k)
24           return  find_ith_os(arr, begin, p - 1 , ith);
25       else
26           return  find_ith_os(arr, p + 1 , end, ith - k);
27  }




你可能感兴趣的:(PKU 2388 Who's in the Middle)