wątki- zrównoleglenie algortymu sortującego

0

Witam,

Potrzebuje zrównoleglić algortym sortowania bombelkowego. NIe bardzo mam pomysł jak to zrobić. Mam taką klase



public class LosujeSortuje {


   int t[];


   public void losuje(int n)
   {
     this.t = new int[n];

     for (int i = 0; i < n; i++)
     {
     Random random = new Random();
     this.t[i] = random.nextInt();
     }
     }

   public void wyswietl(int n)
   {
     for (int i = 0; i < n; i++)
     {
     System.out.println(+this.t[i]);
     }

     }


   public void sortuje(int n)
   {
     for (int i = n-1; i > 0; i--)
     for (int j = 0; j < i; j++)
     {
     if (this.t[j] > this.t[j + 1])
     {
     int temp;
     temp = this.t[j];
     this.t[j] = this.t[j + 1];
     this.t[j + 1] = temp;
     }
   }
   }


}

z góry dzięki za wszelki rady i uwagi.

0
  1. bąbelkowego
  2. A musisz akurat to? Bo zrównoleglić to sobie możesz na przykład sortowanie przez scalanie, quicksorta albo dowolne inne metodą dziel i zwyciężaj.
0

no wlaśnie tak też myślałem ze nie da rady z tym bąbelkowym coś zrobić..

tak na szybko by uniknąć od początku pisania znalazłem taki program sortujacy przez scalanie, niby na wątkach. Jest to poprawnie napisane?

oryginalny kod.

package javaapplication3;

public class Main {

    public static void main(String[] args) throws InterruptedException {
    int i;
    int tablica[];
    int ile_liczb=10;

    tablica = new int[ile_liczb];
	tablica[0]=4;
	tablica[1]=3;
	tablica[2]=10;
	tablica[3]=43;
	tablica[4]=32;
	tablica[5]=0;
	tablica[6]=54;
	tablica[7]=32;
	tablica[8]=12;
	tablica[9]=100;

	System.out.println("Tablica przed posortowaniem:");
		for(i=0; i<ile_liczb; i++)
			System.out.print(tablica[i]+" ");

	Watek w1 = new Watek(tablica, 0, ile_liczb-1);
	w1.start();
	w1.join();

    System.out.println("Tablica po posortowaniu:");

	for(i=0; i<ile_liczb; i++)
		System.out.print(tablica[i]+" ");
    }
}

class Watek extends Thread
{

	int lewy, prawy, tablica[];

    public Watek( int tab[], int _lewy, int _prawy) {
        lewy=_lewy;
        prawy=_prawy;
        tablica=tab;
    }

    public void run(){
        // System.out.println("Started: " + getName());
        if (lewy<prawy) {
            try {
                int m = lewy;
                for (int i = lewy + 1; i <= prawy; i++) {
                    if (tablica[i] < tablica[lewy]) {
                        zamiana(tablica, ++m, i);
                    }
                }
                zamiana(tablica, lewy, m);
                Watek a = new Watek(tablica, lewy, m - 1);
                Watek b = new Watek(tablica, m + 1, prawy);
                a.start();
                b.start();
                a.join();
                b.join();
            } catch (InterruptedException ex) {
                System.out.println("Pojawil sie problem z watkiem " + getName());
            }
        }
        // System.out.println("Stopped: " + getName());
    }

    private static void zamiana(int tab[], int a, int b) {
        int temp=tab[a];
        tab[a]=tab[b];
        tab[b]=temp;
    }
}

sprawdzilem i sortuje. lecz ja potrzebuje przeprowdzić sorotwanie na dużej liczbie liczb ok. 1 mln. więc sprobowalem zrobić generator ktory wypelni randomem tablice a pozniej niech sobie ja sortuje. Lecz chyba coś poknociłem , bo po moim zmianach niechec to sortować. Jestem laikiem wiec na tą chwile nie widze gdzie mam błąd..


package javaapplication3;

import java.util.Random;






class WeziLosujLiczbe {
    
    int tablica[];

   public double getDouble(String s)
   {
   char c;
   StringBuffer buf = new StringBuffer();
   String sx;
   double x;

     System.out.print(s);
     // pobierz x z konsoli jako ciąg znaków
     try
     { 
     
     while ((c = (char) System.in.read() ) != '\n')
     buf.append(c);
     // przekonwertuj x z typu String na typ double
     sx = buf.toString(); 
     x = Double.parseDouble( sx ); 
     } catch (java.io.IOException e) { x = 0; };
     buf.setLength(0); // oczyść bufor
     return x;
    
     
 }
   
        public void losuje(int n)
   {
     this.tablica = new int[n];

     for (int i = 0; i < n; i++)
     {
     Random random = new Random();
     this.tablica[i] = random.nextInt();
     }
     }
          public void wyswietl(int n)
   {
     for (int i = 0; i < n; i++)
     {
     System.out.println(+this.tablica[i]);
     }

     }
}




public class Main {
 
   
 
    public static void main(String[] args) throws InterruptedException {
  /*  int i;
    int tablica[];
    int ile_liczb=10;

    tablica = new int[ile_liczb];
	tablica[0]=4;
	tablica[1]=3;
	tablica[2]=10;
	tablica[3]=43;
	tablica[4]=32;
	tablica[5]=0;
	tablica[6]=54;
	tablica[7]=32;
	tablica[8]=12;
	tablica[9]=100;

        

        
        
	System.out.println("Tablica przed posortowaniem:");
		for(i=0; i<ile_liczb; i++)
			System.out.print(tablica[i]+" ");

	Watek w1 = new Watek(tablica, 0, ile_liczb-1);
	w1.start();
	w1.join();

    System.out.println("Tablica po posortowaniu:");

	for(i=0; i<ile_liczb; i++)
		System.out.print(tablica[i]+" ");
        */
        
        int i ;
           int a;
           int tablica[];

      WeziLosujLiczbe losujizczytaj = new WeziLosujLiczbe();
    
     

     System.out.println("Podaj liczbe elementow tablicy: ");
     a = (int)losujizczytaj.getDouble("n = ");
     losujizczytaj.losuje(a);
    tablica = new int[a];
 System.out.println("Elementy tablicy przed posortowaniem:");
    losujizczytaj.wyswietl(a);
    
     Watek w1 = new Watek(tablica, 0, a-1);
	w1.start();
	w1.join();
     

    

     System.out.println("Elementy tablicy po sortowaniu:");
System.out.println("Tablica po posortowaniu:");

	
        
   //  losujizczytaj.sortuje(a);
     losujizczytaj.wyswietl(a);
         
        
        
    }
}

class Watek extends Thread
{

	int lewy, prawy, tablica[];

    public Watek( int tab[], int _lewy, int _prawy) {
        lewy=_lewy;
        prawy=_prawy;
        tablica=tab;
    }

    public void run(){
     //    System.out.println("Started: " + getName());
        if (lewy<prawy) {
            try {
                int m = lewy;
                for (int i = lewy + 1; i <= prawy; i++) {
                    if (tablica[i] < tablica[lewy]) {
                        zamiana(tablica, ++m, i);
                    }
                }
                zamiana(tablica, lewy, m);
                Watek a = new Watek(tablica, lewy, m - 1);
                Watek b = new Watek(tablica, m + 1, prawy);
                a.start();
                b.start();
                a.join();
                b.join();
            } catch (InterruptedException ex) {
                System.out.println("Pojawil sie problem z watkiem " + getName());
            }
        }
      //   System.out.println("Stopped: " + getName());
    }

    private static void zamiana(int tab[], int a, int b) {
        int temp=tab[a];
        tab[a]=tab[b];
        tab[b]=temp;
    }
}

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