Ordenação em lista duplamente encadeada

4 respostas
V

Gente estou entrando em desespero, eu tentei de varias e varias maneiras fazer o bubbleSort numa lista duplamente encadeada, não funciona, da nullPointer ou entra em loop infinito…

Segue minha ultima tentativa.

public Node get(int i) {
		if (!isEmpty()) {
			int j = 0;
			Node element = head;
			while (j++ < i) {
				element = element.getNext();
				if (element == null)
					return null;
			}
			return element;
		}
		return null;
	}

	public void sort() {
		bubbleSort();
	}

	private void bubbleSort() {
		for (int i = 0; i < size - 1; i++) {
			boolean changed = false;
			for (int j = 0; j < size - i - 1; j++) {
				Node aux = get(j);
				if (aux.getValue() > aux.getNext().getValue()) {
					Node temp1 = get(j);
					Node temp2 = get(j + 1);
					temp1.setNext(temp2.getNext());
					temp2.setPrev(null);
					temp1.setPrev(temp2);
					temp2.getNext().setPrev(temp1);
					changed = true;
				}
			}
			if (!changed)
				return;
		}
	}

Por favor me ajudem com este problema.

4 Respostas

L

tenta assim

private void bubbleSort() {  
     for (int i = 0; i < size - 1; i++) {  
         boolean changed = false;  
         for (int j = 0; j < size - i - 1; j++) {  
             Node aux = get(j);  
             if (aux.getValue() > aux.getNext().getValue()) {  
                 Node temp1 = get(j);  
                 Node temp2 = get(j + 1);  
                 temp1.setNext(temp2.getNext());  
                 temp2.setNext(temp1);
                 temp2.setPrev(temp1.getPrev());  
                 temp1.setPrev(temp2);  
                 changed = true;  
             }  
         }  
         if (!changed)  
             return;  
     }  
 }
V

Null Pointer Excepetion amigo, nesse teu exemplo ai.

V

Gente refiz uma implementação aqui, mas ta com problema ainda…
Ela some alguns valores da lista… Não consigo detectar o erro.

public Node get(int i) {
		if (!isEmpty()) {
			int j = 0;
			Node element = head;
			while (j++ < i) {
				element = element.getNext();
				if (element == null)
					return null;
			}
			return element;
		}
		return null;
	}

	private void bubbleSort() {
		for (int i = 0; i < size - 1; i++) {
			boolean changed = false;
			for (int j = 0; j < size - i - 1; j++) {
				if (get(j + 1) != null) {
					if (get(j).getValue() > get(j + 1).getValue()) {
						//System.out.println("Swapping: " + get(j).getValue() + " : " + get(j + 1).getValue());
						swap(get(j), get(j + 1));
						changed = true;
					}
				}
			}
			if (!changed)
				return;
		}
	}

	public void swap(Node first, Node mid) {
		if (first == head)
			head = mid;
		if (mid == tail) {
			tail = first;
		}
		first.setNext(mid.getNext());
		mid.setPrev(first.getPrev());
		first.setPrev(mid);
		mid.setNext(first);
	}

Lista:
3 - > Head
7
5
0
9
24
5
4 - > Tail

Retornou:
3 - > Head
7
9
24 - > Tail

V

Agora funcionando..

private void bubbleSort() {
		for (Node i = head; i != null; i = i.getNext()) {
			boolean changed = false;
			for (Node j = head; j != null; j = j.getNext()) {
				if (j.getNext() != null) {
					if (j.getValue() > j.getNext().getValue()) {
						swap(j, j.getNext());
						changed = true;
					}
				}
			}
			if (!changed)
				return;
		}
	}

	void swap(Node first, Node second) {
		if (first == head) {
			head = second;
		}
		if (second == tail) {
			tail = first;
		}
		Node temp = first.getNext();
		first.setNext(second.getNext());
		second.setNext(temp);
		if (first.getNext() != null) {
			first.getNext().setPrev(first);
		}
		if (second.getNext() != null) {
			second.getNext().setPrev(second);
		}
		temp = first.getPrev();
		first.setPrev(second.getPrev());
		second.setPrev(temp);
		if (first.getPrev() != null) {
			first.getPrev().setNext(first);
		}
		if (second.getPrev() == null) {
			return;
		}
		second.getPrev().setNext(second);
	}
Criado 22 de novembro de 2011
Ultima resposta 22 de nov. de 2011
Respostas 4
Participantes 2