jueves, 20 de octubre de 2011

10810 - Ultra-QuickSort - UVA

#include<cstdio>
#include<cstdlib>
using namespace std;
long long res = 0;
void juntar(int* lista, const int& ini,const int& med, const int& fin) {
 int vector[fin - ini + 1];
 int i = ini;
 int j = med + 1;
 int k = 0;
 while (i <= med && j <= fin) 
  if (lista[i] <= lista[j])
   vector[k++] = lista[i++];
  else
   vector[k++] = lista[j++], res += med - i + 1;
 while (i <= med) vector[k++] = lista[i++];
 while (j <= fin) vector[k++] = lista[j++];
 
 for (i = 0; i < k; i++) lista[ini + i] = vector[i];
 //free(vector);
}
void merge_sort(int* lista,const int& ini,const int& fin) {
 if (ini < fin) {
  int med = (ini + fin) / 2;
  merge_sort(lista, ini, med);
  merge_sort(lista, med + 1, fin);
  juntar(lista, ini, med, fin);
 }
}
void mostrar(int* lista, const int& n) {
 for (int i = 0; i < n; i++)
  printf("%d ", *(lista + i));
 printf("\n");
}
int main() {
 int n, lista[500000];
 while(scanf("%d", &n)) {
  if (n == 0) break;
  res = 0;
  for (int i = 0; i < n; i++)
   scanf("%d", lista + i);
  merge_sort(lista, 0, n - 1);
  printf("%lld\n", res);
 }
 return 0;
}

No hay comentarios:

Publicar un comentario