hej,
jak z tablicy 50 elementow wybrac 30 najwiekszych (bez uzywania algorytmow sortowania)?
dzieki :)
0
0
Nie rozumiem czemu nie chcesz (nie mozesz) sortowac.
Zawsze mozesz zrobic to ad hoc, np 30 razy usunac element najwiekszy
0
np tak:
import java.util.Arrays;
public class Listy {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long[] tab = new long[50];
for(int i = 0; i < 50; i++){
tab[i] = Math.round(Math.random() * 100);
}
System.out.println("tab: ");
for(int i = 0; i < 50; i++){
System.out.print(", " + tab[i]);
}
long[] tabMax = new long[30];
long podr;
long zamiana;
int n = 0;
for(int i = 0; i < 50; i++){
if(n < 30){
tabMax[n++] = tab[i];
}else{
podr = tab[i];
for(int j = 0; j < n; j++){
if(podr > tabMax[j]){
zamiana = podr;
podr = tabMax[j];
tabMax[j] = zamiana;
}
}
}
}
System.out.println(tab);
System.out.println("\n");
System.out.println("\n\ntabMax\n\n");
for(int i = 0; i < 30; i++){
System.out.print(", " + tabMax[i]);
}
Arrays.sort(tab);
Arrays.sort(tabMax);
System.out.println("\n\n tab pos 30");
for(int i = 20; i < 50; i++){
System.out.print(", " + tab[i]);
}
System.out.println("\n\n tabMax pos");
for(int i = 0; i < 30; i++){
System.out.print(", " + tabMax[i]);
}
}
}
0
Najefektywniejszym rozwiązaniem tego problemu (jeżeli chodzi o czas oczekiwany) jest mądre użycie operacji Partition znanej z QuickSorta.
Działa w czasie O(wielkość tablicy) i nie zależy od liczby poszukiwanych elementów.
Aby znaleźć k największych elementów należy znaleźć k-ty od końca, a następnie zrobić podział właśnie na tym elemencie.