Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

γεια σας...δουλευω πάνω σε μια εργασία αλλά έχω κολλήσει με ένα error.. το οποιο ειναι: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 και θα ήθελα λίγο τα "φώτα" σας αν μπορειτε...ολο το προβλημμα είναι σε αυτή τη μέθοδο :

(στο κυρίως προγραμμα καλείται με τη sort οπότε ξεκινηστε να διαβάζετε απο κάτω προς τα πάνω )

 

 

public static void swap2(Book pinakas[],int x,int y) {
 
 
        int temp=pinakas[x].getEtos();
        pinakas[x].setEtos(pinakas[y].getEtos());
        pinakas[y].setEtos(temp);
 
 
 
    }
 
 
    public static int partition2(Book pinakas[],int f,int l) {
 
 
        int ret_value;
        int lowerLimit=f;
        int mid=(f+l)/2;
        swap2(pinakas,f,mid);
 
        int pivot=pinakas[f].getEtos();
        f++;
 
        while(f<l) {
 
            while(pinakas[f].getEtos()<=pivot && f<l) f++;
            while(pinakas[l].getEtos()>=pivot && f<=l) l--;
            if(f<l) swap2(pinakas,f,l);
 
 
        }
 
 
        if(pivot>(pinakas[f].getEtos())) {
 
            swap2(pinakas,f,lowerLimit);
            ret_value=f;
 
        } else {
        
            if(pivot>=(pinakas[l].getEtos()))  
 
                swap2(pinakas,l,lowerLimit);
                ret_value=l;
 
 
            
        
 
        }return ret_value;    
 
 
    }
 
 
 
    public static void quickSort2(Book pinakas[],int f,int l) {
 
 
                int pivot_index=partition2(pinakas,f,l);
                quickSort2(pinakas,f,pivot_index-1);
                quickSort2(pinakas,pivot_index+1,l);
    
    }
 
 
 
    public static void sort2(Book pinakas[]) {
        
        int metrhths=0;
       for(int i=0;i<pinakas.length;i++){
        if(pinakas!=null)
           metrhths++;
      }
         quickSort2(pinakas,0,metrhths-1);
        
    }

 



στη ουσία είναι η quick sort (γρηγορη ταξινομηση)

Δημοσ.

Υπάρχει στον editor του φόρουμ ειδικό κουμπί για παράθεση κώδικα (το <>) ώστε να μπορούμε να τον διαβάζουμε άνετα (αν και έχει αρκετά προβλήματα). Οπότε ο κώδικας που παρέθεσες γίνεται κάπως έτσι...

 

 

 

	public static void swap2( Book pinakas[], int x, int y )
	{
		int temp = pinakas[x].getEtos();
		pinakas[x].setEtos( pinakas[y].getEtos() );
		pinakas[y].setEtos( temp );
	}
 
	public static int partition2( Book pinakas[], int f, int l )
	{
		int ret_value;
		int lowerLimit = f;
		int mid = (f+l)/2;

		swap2( pinakas, f, mid );

		int pivot = pinakas[f].getEtos();
		f++;

		while ( f < l )
		{
			while ( pinakas[f].getEtos() <= pivot && f < l)
				f++;
			while ( pinakas[l].getEtos() >= pivot && f <= l)
				l--;
			if (f < l)
				swap2( pinakas, f, l );
		}

		if ( pivot > (pinakas[f].getEtos()) ) {
			swap2( pinakas, f, lowerLimit );
			ret_value = f;

		}
		else {
			if ( pivot >= (pinakas[l].getEtos()) )  
				swap2(pinakas,l,lowerLimit);
				ret_value = l;
		}

		return ret_value;    
	}
 
	public static void quickSort2( Book pinakas[], int f, int l )
	{
		int pivot_index = partition2( pinakas, f, l );
		quickSort2( pinakas, f, pivot_index-1 );
		quickSort2( pinakas, pivot_index+1, l );
	}
 
	public static void sort2( Book pinakas[] )
	{
		int metrhths = 0;
		for (int i=0; i < pinakas.length; i++) {
			if ( pinakas[i] != null )
				metrhths++;
		}
		quickSort2( pinakas, 0, metrhths-1 );
	}

 

Από ότι κατάλαβα, πήρες την υλοποίηση της τάξης CS321 του University of Cincinnati και προσπάθησες να τον προσαρμόσεις στο δικό σου πρόγραμμα.

 

Ένα σημείο που δεν ξέρω αν το πρόσεξες είναι πως ο αλγόριθμος που δίνει το Πανεπιστήμιο του Σινσνάτι ΔΕΝ λειτουργεί όταν μέσα στον πίνακα υπάρχουν ίδια νούμερα. Πρέπει να είναι όλα μοναδικά, αλλιώς βγάζει μήνυμα λάθους και σταματάει.

 

Τον δοκίμασα και εγώ και λειτουργεί έτσι ακριβώς. Τον άλλαξα λιγάκι ώστε αντί να του δίνω τους ακέραιους στη γραμμή εντολών, τους έχω ενσωματώσει μέσα στο πρόγραμμα...

 

 

 

import java.io.*;
import java.util.*;
import java.util.Scanner;

/* Implemented in the CS321 class, at the University of Cincinnati
   (http://gauss.ececs.uc.edu/Courses/C321/html/qsort.java.html)

   NOTE: All integers MUST be distinct!
 */
public class QSort
{
	public static void main(String argv[])
	{
		Scanner input = new Scanner(System.in);
		// NOTE: All integers must be distinct
		int[] arr = {100, 12, 6, 54, 89, 32, 0, 1, -10, 102};

		qsort(arr, 0, arr.length-1);

		for (int i=0; i < arr.length; i++)
			System.out.print(arr[i] + " ");
		System.out.println();

		System.out.print( "\npress ENTER..." );
		input.nextLine();
	}

	public static void swap (int A[], int x, int y)
	{
		int temp = A[x];
		A[x] = A[y];
		A[y] = temp;
	}

	// Reorganizes the given list so all elements less than the first are 
	// before it and all greater elements are after it.                   
	public static int partition(int A[], int f, int l)
	{
		int pivot = A[f];
		while (f < l)

		{
			if (A[f] == pivot || A[l] == pivot) 
			{
				System.out.println("Only distinct integers allowed - C321");
				System.out.println("students should ignore this if statement");
				System.exit(0);
			}

			while (A[f] < pivot) f++;
			while (A[l] > pivot) l--;
			swap (A, f, l);
		}
		return f;
	}

	public static void qsort(int A[], int f, int l)
	{
		if (f >= l) return;

		int pivot_index = partition(A, f, l);
		qsort(A, f, pivot_index);
		qsort(A, pivot_index+1, l);
	}

}
Έξοδος:

-10 0 1 6 12 32 54 89 100 102

press ENTER...

 

Πειράζοντας τώρα τον κώδικα που παρέθεσες ώστε να δουλεύει με απλούς ακεραίους αντί για Books, έγραψα το παρακάτω...

 

 

 

import java.util.Scanner;

public class QsortInsomnia
{

	public static void main( String[] args )
	{
		Scanner input = new Scanner(System.in);
		int[] pinakas = {100, 12, 6, 54, 89, 32, 0, 1, -10, 102};

		print_arr( pinakas );
		sort2( pinakas );
		print_arr( pinakas );

		System.out.print( "\npress ENTER..." );
		input.nextLine();
	}

	static void print_arr( int[] pinakas )
	{
		for (int i=0; i < pinakas.length; i++) {
			System.out.print( pinakas[i] + " " );
		}
		System.out.println();
	}

	public static void swap2( int pinakas[], int x, int y )
	{
		int temp   = pinakas[x];
		pinakas[x] = pinakas[y];
		pinakas[y] = temp;
	}
 
	public static int partition2( int pinakas[], int f, int l )
	{
		int ret_value;
		int lowerLimit = f;
		int mid = (f+l)/2;

		swap2( pinakas, f, mid );

		int pivot = pinakas[f];
		f++;

		while ( f < l )
		{
			while ( pinakas[f] <= pivot && f < l)
				f++;
			while ( pinakas[l] >= pivot && f <= l)
				l--;
			if (f < l)
				swap2( pinakas, f, l );
		}

		if ( pivot > pinakas[f] ) {
			swap2( pinakas, f, lowerLimit );
			ret_value = f;

		}
		else {
			if ( pivot >= pinakas[l] )  
				swap2(pinakas, l, lowerLimit);
				ret_value = l;
		}

		return ret_value;    
	}
 
	public static void quickSort2( int pinakas[], int f, int l )
	{
		int pivot_index = partition2( pinakas, f, l );
		quickSort2( pinakas, f, pivot_index-1 );
		quickSort2( pinakas, pivot_index+1, l );
	}
 
	public static void sort2( int pinakas[] )
	{
/*		int metrhths = 0;
		for (int i=0; i < pinakas.length; i++) {
			if ( pinakas[i] != null )
				metrhths++;
		}
*/
		quickSort2( pinakas, 0, pinakas.length-1 );
	}

}

 

Δεν μπήκα στην διαδικασία να κάτσω να τα συγκρίνω, αλλά στα παραθέτω σε αυτό το νήμα και τα δυο με πίνακες ακεραίων, ώστε να το κάνεις εσύ ;)

 

Ο jdb πάντως στον δικό σου κώδικα (τον αλλαγμένο για πίνακες ακεραίων) βαράει ArrayOutOfBounds exception στην γραμμή 61 (στην συνάρτηση: partition2() ):

> jdb QsortInsomnia
Initializing jdb ...
> run
run QsortInsomnia
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started: 100 12 6 54 89 32 0 1 -10 102

Exception occurred: java.lang.ArrayIndexOutOfBoundsException (uncaught)"thread=m
ain", QsortInsomnia.partition2(), line=61 bci=106
61                      if ( pivot >= pinakas[l] )
Σημείωσε επίσης πως έχω βάλει σε σχόλιο τον έλεγχο που κάνεις στην συνάρτηση sort2() αφού οι ακέραιες τιμές δεν μπορούν να συγκριθούν με null.
Δημοσ.

wow!! σε ευχαριστω και μόνο που έκατσες κ ασχοληθηκες τόσο με τον κώδικο :D ...νομίζω πως παραλίγο θα ερχόσουν κ σπίτι μου να το κάνεις :P ... θα καθήσω να τα τσεκάρω αν είναι κ ενημερώνω...σχετικά με το αν υπάρχουν ιδιοι αριθμοι μέσα στο πινακα (που πεταει error) οχι δεν το είχα προσέξει αλλά δεν νομίζω να είναι εκεί το προβλήμα καθως στι δοκιμες δεν εδινα ίδιους αριθμους...thnk u again

Δημοσ.

λοιπόνν επανήλθα..εστω και μετά απο κάποιες μέρες :P ... μετέτρεψα ακριβως τον κωδικα του πανεπιστημίου στον αντίστοιχο που είχα κάνει αλλά πετούσε error... λοιπόν όμως εξακολουθεί να πετάει το συγκεκριμένο error... μηπως κάτι πάει λάθος εκεί στο τέλος που έχω το μετρητή(που βλέπει πόσοι πίνακες δεν είναι αδειοι)??

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...