QuickSort e métodos static

4 respostas
G

Pessoal eu to trabalhando pela primeira vez com quicksort no java. Porem esta dando erro static no meu programa. Gostaria de saber como corrigir este problema!

import java.util.*;
public class desafio{
public static void main(String args[]){
   
    int vet[] = {157,457,12,10000,86,251,0,869,1};
    int v1[] = new int[4];
    int v2[] = new int[4];
    int na =0, n =0, i=0;
    int maior =0, pos=0;
    
    
    /*Instrução para colocar os numeros*/
    
    /*Instrução para achar o maior numero e sua posição dentro do vetor*/
    for( i=0; i<9; i++){
      if(vet[i]> maior)
          maior = vet[i];
          pos = i;
    }
    System.out.print(" O maior numero do vetor de nove posicoes e: " + maior + "\n");
    
   
  /**/  
  for(int h=0; h <vet.length;h++){ 
       System.out.println(vet[h]); 
       } 

  for(int j=0; j<4; j++){
   v1[j]=vet[j];
   System.out.print(" "+v1[j]);
  }  
  
 
  for(int d=0; d<4;d++){
  v2[d]=vet[d+5];
  System.out.print(" "+v2[d]);
  }  
    quick(0,v1.length - 1, v1);
    System.exit(0);
  }

public void quick(int p, int q, int a[]){
 if(p<q){
 int x = part(p,q, a);
 quick(p, x-1, a);
 quick(x + 1, q, a);
 }
}

public int part(int p, int q, int a[]){
 int j = p -1;
 int aux =a[q];
  for(int i=p; i<=q; i++){
    if(a[i]<= aux)
        troca(a, i, ++j);
  }
 return j;

}

public void troca(int a[], int x, int y){
 int aux = a[x];
 a[x]=a[y];
 a[y]=aux;
}

}

O erro é:
non-static method quick(int,int,int[]) cannot be referenced from a static context quick(0,v1.length - 1, v1);

To usando a ferramenta NetBeans para o tranpo…
Isso não é erro de lógica,Correto?

4 Respostas

edymrex

Isso é trabalho de faculdade…!!
antes de busca informações é importante que você de uma verificada no
google e tem muitos tutorias na net que fala sobre métodos static e só vc correr atras…!

G

não é para faculdade, e sim para preparação de maratona… to estudando sozinho por enquanto…enquanto eu engatinho…

caiozanchetti

Gollun, o algorítmo padrão de ordenação dos metodos sort da classe java.util.Arrays é o quicksort. Lembrando, nós temos acesso às API`s portanto, podemos estudar como os métodos foram criados. Vou colar abaixo o código do sort que pede como parametro um int. Mas sugiro que vc de uma olhada no código da API.

Abraço,

/**
     * Sorts the specified sub-array of integers into ascending order.
     */
    private static void sort1(int x[], int off, int len) {
	// Insertion sort on smallest arrays
	if (len &lt 7) {
	    for (int i=off; i<len+off; i++)
		for (int j=i; j>off && x[j-1]&gtx[j]; j--)
		    swap(x, j, j-1);
	    return;
	}

	// Choose a partition element, v
	int m = off + (len &gt&gt 1);       // Small arrays, middle element
	if (len &gt 7) {
	    int l = off;
	    int n = off + len - 1;
	    if (len &gt 40) {        // Big arrays, pseudomedian of 9
		int s = len/8;
		l = med3(x, l,     l+s, l+2*s);
		m = med3(x, m-s,   m,   m+s);
		n = med3(x, n-2*s, n-s, n);
	    }
	    m = med3(x, l, m, n); // Mid-size, med of 3
	}
	int v = x[m];

	// Establish Invariant: v* (<v)* (>v)* v*
	int a = off, b = a, c = off + len - 1, d = c;
	while(true) {
	    while (b &lt= c && x[b] &lt= v) {
		if (x[b] == v)
		    swap(x, a++, b);
		b++;
	    }
	    while (c &gt= b && x[c] &gt= v) {
		if (x[c] == v)
		    swap(x, c, d--);
		c--;
	    }
	    if (b &gt c)
		break;
	    swap(x, b++, c--);
	}

	// Swap partition elements back to middle
	int s, n = off + len;
	s = Math.min(a-off, b-a  );  vecswap(x, off, b-s, s);
	s = Math.min(d-c,   n-d-1);  vecswap(x, b,   n-s, s);

	// Recursively sort non-partition-elements
	if ((s = b-a) &gt 1)
	    sort1(x, off, s);
	if ((s = d-c) &gt 1)
	    sort1(x, n-s, s);
    }


    /**
     * Swaps x[a] with x[b].
     */
    private static void swap(int x[], int a, int b) {
	int t = x[a];
	x[a] = x[b];
	x[b] = t;
    }

    /**
     * Returns the index of the median of the three indexed integers.
     */
    private static int med3(int x[], int a, int b, int c) {
	return (x[a] &lt x[b] ?
		(x[b] &lt x[c] ? b : x[a] &lt x[c] ? c : a) :
		(x[b] &gt x[c] ? b : x[a] &gt x[c] ? c : a));
    }


    /**
     * Swaps x[a .. (a+n-1)] with x[b .. (b+n-1)].
     */
    private static void vecswap(int x[], int a, int b, int n) {
	for (int i=0; i<n; i++, a++, b++)
	    swap(x, a, b);
    }
>
Bani

Isso é um problema de OO.

Veja, seu método main é

public static void main(String args[])

E seu método quick é apenas

public void quick(int p, int q, int a[])

Sempre que você está dentro de um método static todos os métodos que você for chamar devem ser static também ou então você precisa instanciar um objeto e chamar o método desse objeto. Ou seja, a solução fácil é mudar a assinatura de todos os seus métodos para static, porém em circustâncias diferentes de estar apenas estudando um algoritmo eu recomendaria que instanciasse um objeto.

Criado 14 de abril de 2007
Ultima resposta 14 de abr. de 2007
Respostas 4
Participantes 4