Advertisement
kartikkukreja

Randomized selection algorithm

May 18th, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <ctime>
  4.  
  5. /*
  6.  * Chooses a random pivot in A[p...r] and partitions the array such that
  7.  * all elements smaller than the pivot lie on its left and all elements
  8.  * larger than the pivot lie on its right.
  9.  * Returns the position of the pivot in the partitioned array.
  10.  */
  11. int partition(int *A, int p, int r) {
  12.     int i = p + rand() % (r - p + 1); // generate a random number in {p, ..., r}
  13.     int temp = A[r]; A[r] = A[i]; A[i] = temp; // swap A[r] and A[i]
  14.     int x = A[r];
  15.     i = p - 1;
  16.     for(int j=p; j<r; j++)
  17.         if(A[j] <= x)   {
  18.             i++;
  19.             temp = A[j]; A[j] = A[i]; A[i] = temp; // swap A[i] and A[j]
  20.         }
  21.     temp = A[r]; A[r] = A[i+1]; A[i+1] = temp; // swap A[r] and A[i+1]
  22.     return i+1;
  23. }
  24.  
  25. /*
  26.  * Returns the ith order statistic i.e., the ith smallest number in A[p...r]
  27.  * 0 <= p <= r < A.length and 1 <= i <= A.length
  28.  */
  29. int recursiveSelect(int *A, int p, int r, int i)    {
  30.     if(p == r) return A[p];
  31.     int q = partition(A, p, r);
  32.     int k = q - p + 1;
  33.     if(i == k) return A[q];
  34.     else if(i < k) return recursiveSelect(A, p, q-1, i);
  35.     else return recursiveSelect(A, q+1, r, i-k);
  36. }
  37.  
  38. /*
  39.  * Returns the ith order statistic i.e., the ith smallest number in A[0...n-1]
  40.  * n == A.length and 1 <= i <= n
  41.  */
  42. int iterativeSelect(int *A, int n, int i)   {
  43.     int low = 0, high = n - 1, mid, k;
  44.     while(low < high)   {
  45.         mid = partition(A, low, high);
  46.         k = mid - low + 1;
  47.         if(i == k) return A[mid];
  48.         else if(i < k)
  49.             high = mid - 1;
  50.         else    {
  51.             low = mid + 1;
  52.             i -= k;
  53.         }
  54.     }
  55.     return A[low];
  56. }
  57.  
  58. int main()  {
  59.     int *arr, N, i;
  60.     srand(time(NULL));
  61.  
  62.     printf("Enter size of array : ");
  63.     scanf("%d", &N);
  64.     arr = new int[N];
  65.     printf("Enter %d integers :\n", N);
  66.     for(i=0; i<N; i++)
  67.         scanf("%d", &arr[i]);
  68.  
  69.     printf("Enter i (0 to exit): ");
  70.     scanf("%d", &i);
  71.     while(i > 0 && i <= N)    {
  72.         printf("'%d'th order statistic :\n", i);
  73.         printf("\tRecursive selection : %d\n", recursiveSelect(arr, 0, N-1, i));
  74.         printf("\tIterative selection : %d\n", iterativeSelect(arr, N, i));
  75.  
  76.         printf("Enter i (0 to exit): ");
  77.         scanf("%d", &i);
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement