Písemka - maturanti

Napište funkci, která zadané pole řetězců znaků utřídí přihrádkovým tříděním podle jejich prvního znaku. Řetězce obsahují jen malá písmena anglické abecedy.

Ukázkové řešení - Ruby:

def bucketsort(seznam)
  prihradky = Array.new
  26.times do
    prihradky << Array.new
  end
  seznam.each do |retezec|
    ascii = retezec[0]
    prihradky[ascii - ?a] << retezec
  end
  return prihradky.flatten
end

bucketsort(["azalka", "brambora", "banan", "ananas", "citron"])

Písemka - nematuranti

Napište funkci, která dostane dvě utříděná pole čísel (od nejmenšího) a sléváním z nich vyrobí jedno velké utříděné pole.

Jestli to píšete v C nebo C++, můžete předpokládat, že obě vstupní pole mají 10 prvků.

Ukázkové řešení - C++

#include <iostream>
using namespace std;

// funkce typu pole intů (přesněji: ukazatel na int)
int *merge(int levy[10], int pravy[10]){
	// vytvoříme si pole na výsledky
	int *vysledky = new int[20];
	int l = 0, r = 0, v = 0;
	// slučujeme pole, dokud jsou prvky v obou
	while (l < 10 && r < 10){
		if (levy[l] < pravy[r])
			vysledky[v++] = levy[l++];
		else
			vysledky[v++] = pravy[r++];
	}
	// na konec přidáme zbývající prvky v jednom z polí
	while (l < 10)
		vysledky[v++] = levy[l++];
	while (r < 10)
		vysledky[v++] = pravy[r++];
	return vysledky;
}

// ukázkové použití (do písemky není třeba psát)
int main(){
	int a[]={2, 3, 6, 7, 13, 14, 19, 22, 23, 27},
	    b[]={2, 2, 9, 9, 11, 12, 16, 17, 19, 22};
	// necháme si obě pole spojit
	int *pole = merge(a,b);
	for (int i = 0; i < 19; i++)
		cout << pole[i] << ", ";
	cout << pole[19] << endl;
	// co jsme vytvořili pomocí new, bychom měli smazat pomocí delete
	delete pole;
}