Sprawdź się
Uzupełnij brakujące miejsca w kodzie tak, aby otrzymać działający program realizujący algorytm sortowania pozycyjnego słów. Dane powinny zostać posortowane leksykograficznie. Swój program przetestuj dla danych magda, ala, adam, ewa. Skorzystaj z wybranego przez siebie stabilnego algorytmu sortowania.
Specyfikacja problemu:
Dane:
dane– jednowymiarowa tablica zawierająca imiona do posortowania
Wynik:
program wypisuje posortowaną tablicę
danew porządku leksykograficznym; kolejne elementy tablicy wypisywane są w nowej linii
Przykładowe rozwiązanie zadania:
public class Main {
static void przygotujSlowa(String[] dane, int dlugoscNajdluzszegoSlowa) {
for (int i = 0; i < dane.length; i++) {
while (dane[i].length() < dlugoscNajdluzszegoSlowa) {
dane[i] = dane[i] + "`";
}
}
}
static void wyczyscNapisy(String[] dane) {
for (int i = 0; i < dane.length; i++) {
dane[i] = dane[i].replace("`", "");
}
}
static void radixSort(String[] dane) {
int dlugoscNajdluzszegoSlowa = dane[0].length();
for (int i = 1; i < dane.length - 1; i++) {
if(dane[i].length() > dlugoscNajdluzszegoSlowa) {
dlugoscNajdluzszegoSlowa = dane[i].length();
}
}
przygotujSlowa(dane, dlugoscNajdluzszegoSlowa);
for (int i = dlugoscNajdluzszegoSlowa - 1; i >= 0; i--) {
sortowaniePrzezZliczanie(dane, i);
}
wyczyscNapisy(dane);
}
static void sortowaniePrzezZliczanie(String[] dane, int indeksZnaku) {
int[] tablicaZliczenLiczb = new int[27];
for (int i = 0; i < dane.length; i++) {
int odczytanyKodZnaku = dane[i].charAt(indeksZnaku) - '`';
tablicaZliczenLiczb[odczytanyKodZnaku]++;
}
for (int i = 1; i < 27; i++) {
tablicaZliczenLiczb[i] += tablicaZliczenLiczb[i - 1];
}
String[] temp = new String[dane.length];
for (int i = dane.length - 1; i >= 0; i--) {
int odczytanyKodZnaku = dane[i].charAt(indeksZnaku) - '`';
int indeksWTablicyWynikowej = tablicaZliczenLiczb[odczytanyKodZnaku] - 1;
temp[indeksWTablicyWynikowej] = dane[i];
tablicaZliczenLiczb[odczytanyKodZnaku]--;
}
for (int i = 0; i < temp.length; i++) {
dane[i] = temp[i];
}
}
public static void main(String[] args) {
String[] dane = {
"magda",
"ala",
"adam",
"ewa"
};
radixSort(dane);
for (int i = 0; i < dane.length; i++) {
System.out.println(dane[i]);
}
}
}Zmodyfikuj podany kod tak, aby sortował pozycyjnie ciągi znaków utworzone z cyfr. Dane powinny być posortowane w porządku odwrotnym do leksykograficznego. W porządku leksykograficznym ciąg „11” powinien znaleźć się przed ciągiem „9” (traktujemy liczby jakby to były słowa). W tym zadaniu jednak stosujemy porządek odwrotny do leksykograficznego, zatem „9” powinno stać przed „11”. W sortowaniu pozycyjnym zastosuj wybrany przez siebie stabilny algorytm sortowania.
Specyfikacja problemu:
Dane:
dane– jednowymiarowa tablica przechowująca łańcuchy znaków będące ciągami cyfr do posortowania
Wynik:
program wypisuje posortowaną w porządku odwrotnym do leksykograficznego tablicę
dane; kolejne elementy tablicy wypisywane są w nowej linii
Przykładowe rozwiązanie zadania:
public class Main {
static void przygotujSlowa(String[] dane, int dlugoscNajdluzszegoSlowa) {
for (int i = 0; i < dane.length; i++) {
while (dane[i].length() < dlugoscNajdluzszegoSlowa) {
dane[i] = dane[i] + "/";
}
}
}
static void wyczyscNapisy(String[] dane) {
for (int i = 0; i < dane.length; i++) {
dane[i] = dane[i].replace("/", "");
}
}
static void radixSort(String[] dane) {
int dlugoscNajdluzszegoSlowa = dane[0].length();
for (int i = 1; i < dane.length - 1; i++) {
if(dane[i].length() > dlugoscNajdluzszegoSlowa) {
dlugoscNajdluzszegoSlowa = dane[i].length();
}
}
przygotujSlowa(dane, dlugoscNajdluzszegoSlowa);
for (int i = dlugoscNajdluzszegoSlowa - 1; i >= 0; i--) {
sortowanieBabelkowe(dane, i);
}
wyczyscNapisy(dane);
}
static void sortowanieBabelkowe(String[] slowa, int indeksZnaku) {
int n = slowa.length;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - i - 1; j++) {
if (slowa[j].length() > indeksZnaku && slowa[j + 1].length() > indeksZnaku) {
if (slowa[j].charAt(indeksZnaku) < slowa[j + 1].charAt(indeksZnaku)) {
String pom = slowa[j];
slowa[j] = slowa[j + 1];
slowa[j + 1] = pom;
}
}
}
}
public static void main(String[] args) {
String[] dane = {
"0123",
"94141",
"119",
"4964",
"750",
"0"
};
radixSort(dane);
for (int i = 0; i < dane.length; i++) {
System.out.println(dane[i]);
}
}
}Organizatorzy debaty na podstawie zgłoszeń przygotowali listę dziennikarzy, którzy po kolei będą zadawać pytania politykom. Kolejność pytań miała zostać ustalona według porządku alfabetycznego. Zgłoszenia przychodziły jednak w losowej kolejności. Dziennikarka o nazwisku Kornas do ostatniej chwili nie potwierdziła swojej obecności na debacie – miała połączyć się ze studiem telefonicznie. Zespół odpowiedzialny za połączenie oczekuje na informację, która w kolejności powinna być ta osoba. Użyj sortowania pozycyjnego słów, aby wyznaczyć kolejność (indeks) tej dziennikarki w posortowanej liście.
W sortowaniu pozycyjnym skorzystaj z dowolnego stabilnego algorytmu sortowania. Zwróć uwagę, że stosujemy numerację od 0.
Dla ułatwienia nazwiska zapisano małymi literami oraz bez znaków diakrytycznych.
Specyfikacja problemu:
Dane:
dane– jednowymiarowa tablica zawierająca nazwiska dziennikarek i dziennikarzy
Wynik:
program wypisuje posortowaną w kolejności leksykograficznej tablicę
daneoraz indeks elementukornasw posortowanej tablicydane
Przykładowe rozwiązanie zadania:
public class Main {
static void przygotujNazwiska(String[] dane, int dlugoscNajdluzszegoNazwiska) {
for (int i = 0; i < dane.length; i++) {
while (dane[i].length() < dlugoscNajdluzszegoNazwiska) {
dane[i] = dane[i] + "`";
}
}
}
static void wyczyscNapisy(String[] dane) {
for (int i = 0; i < dane.length; i++) {
dane[i] = dane[i].replace("`", "");
}
}
static void radixSort(String[] dane) {
int dlugoscNajdluzszegoNazwiska = dane[0].length();
for (int i = 1; i < dane.length - 1; i++) {
if(dane[i].length() > dlugoscNajdluzszegoNazwiska) {
dlugoscNajdluzszegoNazwiska = dane[i].length();
}
}
przygotujNazwiska(dane, dlugoscNajdluzszegoNazwiska);
for (int i = dlugoscNajdluzszegoNazwiska - 1; i >= 0; i--) {
sortowaniePrzezZliczanie(dane, i);
}
wyczyscNapisy(dane);
}
static void sortowaniePrzezZliczanie(String[] dane, int indeksZnaku) {
int[] tablicaZliczenLiczb = new int[27];
for (int i = 0; i < dane.length; i++) {
int odczytanyKodZnaku = dane[i].charAt(indeksZnaku) - '`';
tablicaZliczenLiczb[odczytanyKodZnaku]++;
}
for (int i = 1; i < 27; i++) {
tablicaZliczenLiczb[i] += tablicaZliczenLiczb[i - 1];
}
String[] temp = new String[dane.length];
for (int i = dane.length - 1; i >= 0; i--) {
int odczytanyKodZnaku = dane[i].charAt(indeksZnaku) - '`';
int indeksWTablicyWynikowej = tablicaZliczenLiczb[odczytanyKodZnaku] - 1;
temp[indeksWTablicyWynikowej] = dane[i];
tablicaZliczenLiczb[odczytanyKodZnaku]--;
}
for (int i = 0; i < temp.length; i++) {
dane[i] = temp[i];
}
}
static int znajdzNazwisko(String[] dane) {
for (int i = 0; i < dane.length; i++) {
if (dane[i].equals("kornas")) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
String[] dane = {
"kaluza",
"wasniewski",
"klasa",
"fil",
"leszko",
"radtke",
"stepniak",
"falek",
"skrzypek",
"smykowska",
"sroka",
"kornas",
"pustelnik"
};
radixSort(dane);
System.out.println(znajdzNazwisko(dane));
}
}