Cod sursa(job #1467615)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 3 august 2015 19:25:21
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <vector>
#include <cstdlib>
#include <fstream>


template <typename T>
void print(T *v, int N) {
	for (int i = 0; i < N; i++) { 
		std::cout << v[i] << (i < N -1 ? ' ' : '\n');
	}
}

template <typename T>
void heapify(T *H, const int& N, int i, bool (* const cmp)(const T&, const T&)) {
  int smallerSon = i, right, left;

  while (1) {
  	smallerSon = i;
  	right = 1 + (left = (i << 1));

  	if (left <= N && cmp(H[left], H[smallerSon])) smallerSon = left;
  	if (right <= N && cmp(H[right], H[smallerSon])) smallerSon = right;

  	if (smallerSon != i) {
    	std::swap(H[smallerSon], H[i]);
    	i = smallerSon;
  	} else {
  		return;
  	}
  }

}

bool my_cmp(const int& first, const int& last) {
  return first > last;
}

template <typename T>
void HeapSort(T *vbegin, T *vend, bool (*cmp)(const T&, const T&) = my_cmp) {
  T *H = vbegin - 1;
  int N = (vend - vbegin);
  
  for (int i = N/2; i >= 1; --i) {
    heapify<T>(H, N, i, cmp);
  }

  while ( N != 1 ){
  	std::swap(H[1], H[N]); 
  	heapify<T>(H, --N, 1, cmp);
  }

}

int main() {
  std::ifstream f("algsort.in");
  std::ofstream g("algsort.out");

	int N, *v;

  f >> N;
  v = new int[N];
	
	for (int i = 0; i < N; i++) {
		f >> v[i];
	}

	HeapSort<int>(v, v + N);

	for (int i = 0; i < N; i++) { 
    g << v[i] << (i < N -1 ? ' ' : '\n');
  }

  delete[] v;
	return 0;
}