Cod sursa(job #2041446)

Utilizator dementorrDementhor dementorr Data 17 octombrie 2017 12:38:33
Problema Statistici de ordine Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.86 kb
#include <stdio.h>

int v[3000000];

void swap (int *a, int *b) {
  int tmp = *a;
  *a = *b;
  *b = tmp;
}

int sdo (int *v, int left, int right, int k) {
  int pivot = v[(left + right) / 2];

  /*
  printf ("======QUICKSORTING=====\n");
  printf ("pivot = %d, left = %d, right = %d, k =  %d\n", pivot, left, right, k);

  int i;
  for (i = 0; i < 8; ++i)
    printf ("%d ", v[i]);
  printf ("\n");
  */

  if (k == 0)
    return v[left];
  
  if (left >= right)
    return v[left];
  
  int begin = left, end = right;
  while (begin <= end) {    
    while (v[begin] < pivot)
      ++begin;
    while (v[end] > pivot)
      --end;

    if (begin <= end) {
      swap (&v[begin], &v[end]);
      ++begin;
      --end;
    }
  }
  /*
  printf ("=========After partitioning step=========\n");
  for (i = 0; i < 8; ++i)
    printf ("%d ", v[i]);
  printf ("\n");

  
  printf ("k = %d, end = %d, begin = %d\n", k, end, begin);
  */
  if (k < end)
    return sdo (v, left, end, k);
  else
    return sdo (v, begin, right, k - end - 1);
}

void quicksort(int *v, int left, int right) {
  int pivot = v[(left + right) / 2];

  if (left >= right)
    return;
  
  int begin = left, end = right;
  while (begin <= end) {    
    while (v[begin] < pivot)
      ++begin;
    while (v[end] > pivot)
      --end;

    if (begin <= end) {
      swap (&v[begin], &v[end]);
      ++begin;
      --end;
    }
  }

  quicksort (v, left, end);
  quicksort (v, begin, right);
}

int main () {
  freopen ("sdo.in", "r", stdin);
  freopen ("sdo.out", "w", stdout);
  
  int n, k;
  scanf ("%d%d", &n, &k);

  int i;
  for (i = 0; i < n; ++i)
    scanf ("%d", &v[i]);

  //printf ("I am looking for the smallest %d\n", k);
  int s = sdo (v, 0, n - 1, k);
  printf ("%d\n", s);
  //quicksort(v, s, n);
  
  /*quicksort(v, 0, n - 1);
    for (i = 0; i < n; ++i)
    printf ("%d ", v[i]);
    printf ("\n");
  */

  return 0;
}