najwieksze elementy tab

0

hej,
jak z tablicy 50 elementow wybrac 30 najwiekszych (bez uzywania algorytmow sortowania)?
dzieki :)

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.

http://www.google.pl/search?q=wyb%C3%B3r+k-tego+elementu

1 użytkowników online, w tym zalogowanych: 0, gości: 1