Trabalhe em casa

sábado, 22 de janeiro de 2011

Métodos de ordenação - Java

 
ALGORÍTMOS JAVA 
Da turma de Algoritmos e Programação do semestre 2010A da Univates.
Aulas ministradas pelo professor Alexandre Stürmer Wolf. By Dizzy.

BUBBLE SORT
public class BubbleSort {
  public static void main (String [] args){
    int dados []={7,4,8,5,7,2,12,1,7};//chamado n² pois ele testa cada um com os outros. compara o 7 com o 4, 8, 5.......
    int i=0;
    while (i<dados.length){
      int x=0;
      while (x<dados.length) {
        if (dados[i]<dados[x]){
          int aux=dados[i];
          dados[i]=dados[x];
          dados[x]=aux;
        }
        x=x+1;
      }
      i=i+1;
    }
    int z=0;
    while (z<dados.length){
      System.out.println(dados[z]);
      z=z+1;
    }
  }
}
BUBBLE SORT II
public class BubbleSortII {
  public static void main (String [] args){
    int dados []={7,4,8,5,7,2,12,1,7};
    boolean trocou=true;
    while (trocou){
      trocou=false;
      int i=0;
      while (i<dados.length-1){
        if (dados[i]<dados[i+1]){
          int aux=dados[i];
          dados[i]=dados[i+1];
          dados[i+1]=aux;
          trocou=true;
        }
        i=i+1;
      }
    }
    int z=0;
    while (z<dados.length){
      System.out.println (dados[z]);
      z=z+1;
    }
  }
}
 BUBBLE SORT (VERSÃO MELHORADA)
public class BubbleSortMelhorado {
  public static void main (String [] args){
    int dados []={7,4,8,5,7,2,12,1,7};//chamado n² pois ele testa cada um com os outros. compara o 7 com o 4, 8, 5.......
    int i=0;
    while (i<dados.length){
      int x=i+1;
      while (x<dados.length) {
        if (dados[i]<dados[x]){
          int aux=dados[i];
          dados[i]=dados[x];
          dados[x]=aux;
        }
        x=x+1;
      }
      i=i+1;
    }
    int z=0;
    while (z<dados.length){
      System.out.println(dados[z]);
      z=z+1;
    }
  }
}

Um pouco sobre o Bubble Sort:

O bubble sort, ou ordenação por flutuação (literalmente "por bolha"), é um algoritmo de ordenação dos mais simples. A ideia é percorrer o vector diversas vezes, a cada passagem fazendo flutuar para o topo o maior elemento da sequência. Essa movimentação lembra a forma como as bolhas em um tanque de água procuram seu próprio nível, e disso vem o nome do algoritmo.
No melhor caso, o algoritmo executa n2 / 2 operações relevantes, onde n representa o número de elementos do vector. No pior caso, são feitas 2n2 operações. No caso médio, são feitas 5n2 / 2 operações. A complexidade desse algoritmo é de Ordem quadrática. Por isso, ele não é recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados.
O algoritmo pode ser descrito em pseudo-código como segue abaixo. V é um VECTOR de elementos que podem ser comparados e n é o tamanho desse vector.
BUBBLESORT (V[], n)
1    houveTroca <- verdade                       # uma variável de controle
2    enquanto houveTroca for verdade faça:
3        houveTroca <- falso
4        para i de 1 até n-1 faça:
5              se V[i] vem depois de V[i + 1]
6                   então troque V[i] e V[i + 1] de lugar e
7                   houveTroca <- verdade

Método em outras linguagens (fonte wikipedia):

Portugol

    //Algoritmo BubbleSort no PortugolViana
    Inteiro a[5] <- {5,9,2,7,1}, n <- 5, aux, i, j
 
    Para i de 5 até 1 Passo -1
        Para j de 1 até (i - 1) Passo 1
            Se a[j - 1] > a[j] Então
                aux <- a[j]
                a[j] <- a[j - 1]
                a[j - 1] <- aux
            FimSe
        Proximo
    Proximo
 
    Escrever "Vetor ordenado: "
    Para i de 0 até n - 1
        Escrever a[i], ","
    Próximo


 Assembly
/*void bubble_as2 (int *x, int n);*/
.globl bubble_as2
/* assembler utilizado gas (x86 - Linux) */
bubble_as2:
    pushl %ebp
    movl %esp, %ebp
    movl 12(%ebp), %eax /* tamanho -> %eax */
    movl 8(%ebp), %ecx /* início do vetor -> %ecx */
    movl $4, %ebx
    dec %eax
    mul %ebx
    addl %eax, %ecx /* %ecx aponta p/ o último do elemento do vetor */
    pushl %ecx
_bubble_as2_l1:
    movl $0, %edx
    movl 8(%ebp), %ebx
    movl %ebx, %eax
    addl $4, %eax
_bubble_as2_l2:
    cmp %eax, %ecx
    jl _bubble_as2_l1_end
    movl (%ebx), %ecx
    cmp (%eax), %ecx
    jl _bubble_as2_l2_end
    /* troca */
    movl (%eax), %edx
    movl %edx, (%ebx)
    movl %ecx, (%eax)
    movl $1, %edx
_bubble_as2_l2_end:
    movl %eax, %ebx
    addl $4, %eax
    movl (%esp), %ecx
    jmp _bubble_as2_l2
_bubble_as2_l1_end:
    cmp $0, %edx
    je _bubble_as2_fim
    popl %ecx
    subl $4, %ecx
    pushl %ecx
    jmp _bubble_as2_l1
_bubble_as2_fim:
    leave
    retts

C
#include <stdbool.h>
 
inline void troca(int* a, int* b)
{
  int aux = *a;
  *a = *b;
  *b = aux;
}
 
void bubbleSort (int *primeiro, int *ultimo)
{
  bool naoTrocou;
  int *posAtual;
  for (; ultimo > primeiro; --ultimo)
  {
    naoTrocou = true;
    for (posAtual = primeiro; posAtual < ultimo; ++posAtual)
    {
      if (*posAtual > *(posAtual+1))
      {
        troca (posAtual, posAtual+1);
        naoTrocou = false;
      }
    }
    if (naoTrocou) return;
  }
}

Java
public class Bolha {
 
    public void bubbleSort(int v[]) {
 
        for (int i = v.length; i >= 1; i--) {
            for (int j = 1; j < i; j++) {
                if (v[j - 1] > v[j]) {
                    int aux = v[j];
                    v[j] = v[j - 1];
                    v[j - 1] = aux;
                }
            }
        }
    }
}

C
Usando "do while".

void swapbubble( int v[], int i)
{
 
int aux=0;
 
   aux=v[i];
   v[i] = v[i+1];
   v[i+1] = aux;
 
}
 
  void bubble(int v[], int qtd)
{
    int i;
    int trocou;
 
    do
    {
        qtd--;
        trocou = 0;
 
        for(i = 0; i < qtd; i++)
            if(v[i] > v[i + 1])
            {
                swapbubble(v, i);
                trocou = 1;
 
            }
    }while(trocou);
}

Método de ordenação Bolha com ordenação de strings.
void bubble(int v[], int qtd)
//UTILIZA BIBLIOTECA string.h
{
    int i;
    int trocou;
    char aux;

    do
    {
        qtd--;
        trocou = 0;

        for(i = 0; i < qtd; i++)
            if(strcasecmp(v[i],v[i + 1])>0)
            {
                /*o ideal seria fazer uma função troca aqui*/
                strcpy(aux, v[i]);
                strcpy(v[i], v[i + 1]);
                strcpy(v[i + 1], aux);
                trocou = 1;
            }
    }while(trocou==1);
}

C++
#include "Bubblesort.h"
void bubblesort(vetor &a, tamanho n)
{
 for(int j= n-1; j>0; j--){
  for(int i=0;i<j;i++){
   if(a[i+1] < a[i]){
     swap(a[i+1], a[i]);
   }
  }
 }
}

for (int i = vetor.length - 1; i > 0; i--)
          {
              for (int j = 0; j < i; j++)
              {
                  if (vetor[i] < vetor[j])
                  {
                      int swap   = vetor[i];
                      vetor[i]   = vetor[j];
                      vetor[j] = swap;
                  }
              }
          }

ML
fun fix ( f,x) =
    let val fx = f(x)
    in
        if x = fx then x
        else fix(f,fx)
end;

fun bubble ([]) = []
        | bubble([a]) = [a]
        | bubble(a::b::x) =
                if a <= b then a::bubble(b::x)
                else b::bubble(a::x);

fun bubblesort( lista ) = fix (bubble,lista);


Pascal

O código a seguir ilustra o algoritmo, para ordenar n números inteiros:
  program ordenacao;
  uses crt;
  const
    n = 20;
  var
    vet:array[1..n]of integer;
    i,j,aux: integer;
  begin
    randomize;
    {Preenche o array com valores aleatórios}
    for i := 1 to n do
      vet[i] := random(100);
    {Ordena o array}
    for i := n downto 2 do
         for j := 1 to i-1 do
            if vet[j] > vet[j+1] then
            begin
                aux := vet[j];
                vet[j] := vet[j+1];
                vet[j+1] := aux;
            end;     
  end.

Implementação do Algoritmo Bolha com Flag
program BolhacomFLag;
uses wincrt;
const
n=10;
  var
  vet:array[1..n] of integer;
  i,aux:integer;
  houveTroca:boolean;
 begin
  i:=0;
  houveTroca:=true;
  randomize;
    for i:=1 to n do
         vet[i]:=random(100);
         for i:=1 to n do
          writeln(vet[i]);
      repeat
        houveTroca:=false;
          for i:=1 to n-1 do
             if ( vet[i] > vet[i+1]) then
               begin
               aux := vet[i];
               vet[i]:= vet[i+1];
               vet[i+1]:= aux;
               houveTroca:=true;
              end;
         until (houveTroca = false);
         writeln('Escrevendo Vetor Ordenado');
         for i:=1 to n do
         writeln(vet[i]);
 {by X}
 end.

Python
def bubblesort(l):
    for passesLeft in range(len(l)-1, 0, -1):
        for index in range(passesLeft):
            if l[index] < l[index + 1]:
               l[index], l[index + 1] = l[index + 1], l[index]
    return l


def bubbleSort(L,n):
    flag = True
    while flag:
        flag = False
        for i in range(n-1):
            if L[i] > L[i+1]:
                L[i],L[i+1] = L[i+1],L[i]
                flag = True

Ruby
def bubble_sort(list)
  swapped = true
  while swapped
    swapped = false
    (list.size - 1).times do |i|
      if list[i] > list[i+1]
        list[i], list[i+1] = list[i+1], list[i]
        swapped = true
      end
    end
  end
 
  list
end

Perl
sub swap {
  @_[0, 1] = @_[1, 0];
}

sub bubble_sort {
  for ($i=$|; $i < $#_; ++$i) {
    for ($j=$|; $j < $#_; ++$j) {
      ($_[$j] > $ _[$j+1]) and swap($_[$j], $_[$j+1]);
    }
  }
}

C#
       private void BubbleSort(int[] vetor)
       {
 
       //Ordem Decrescente
 
            for (int i = vetor.Length - 1; i > 0; i--)
            {
                for (int j = 0; j < i; j++)
                {
                    if (vetor[i] > vetor[j])
                    {
                        int swap   = vetor[i];
                        vetor[i]   = vetor[j];
                        vetor[j] = swap;
                    }
                }
            }
       }

PHP
        <?php
        /*
            Esta função troca o valor de duas variáveis entre si.
            Opcional. Pode ser embutido na bolha
        */
        function swap(&$valor_1, &$valor_2) {
            list($valor_1, $valor_2) = array($valor_2, $valor_1);
        }
       
        /* Array de teste */
        $arrToSort = array(1, 4, 7, 3, 8, 9, 10);
        $length = count($arrToSort)
        /* a BOLHA! ;-) */
        for ($i = 0; $i < $length; $i++) {
            for ($j = $i; $j < count($arrToSort); $j++) {
                if ($arrToSort[$i] > $arrToSort[$j]) {
                    swap($arrToSort[$i], $arrToSort[$j]);
                }
            }
        }
       
        /* Opcional. Exibe o array de um jeito que nós podemos entender! =D */
        print_r($arrToSort);
        ?>

<?php
function BubbleSort( $items ) {
    $temp = "";
    $size = count( $items );
    for( $i = 1; $i < $size; $i++ ) {
         for( $j = 1; $j < $size - $i; $j++ ) {
              if( $items[$j+1] < $items[$j] ) {
                   $temp = $items[$j];
                   $items[$j] = $items[$j+1];
                   $items[$j+1] = $temp;
              }
         }
    }
}

$items = array(31, 41, 59, 26, 41, 58);
BubbleSort( $items );
?>

Shell script
#! /bin/bash
vetor=( 2 1 3 4 5 )

bubble_sort(){
    aux=0

    for (( a = 0 ; a < ${#vetor[*]} ; a++ ))
    do
        for (( b = 0 ; b < ${#vetor[*]} ; b++ ))
        do
            [[ ${vetor[$b]} -lt ${vetor[$a]} ]] && { aux=${vetor[$b]} ; vetor[$b]=${vetor[$a]} ; vetor[$a]=$aux ; }
        done
    done
}

bubble_sort

echo "${vetor[*]}"

Lua
function bubbleSort(v)
    for i=#v, 1, -1 --Lembrando que vetores no lua começam no "1" e não no "0"
    do
        for j=1, i-1, 1
        do
            if(v[j]>v[j+1])
            then
                v[j],v[j+1] = v[j+1],v[j]
            end
        end
    end
end

Matlab
for(i = 1:n-1)
    for(j = 1:n-i)
        if(x(j) > x(j + 1))
            aux = x(j);
            x(j) = x(j + 1);
            x(j + 1) = aux;
        end
    end
end

ASP
<%
Dim links(5)
links(0) = 1
links(1) = 3
links(2) = 5
links(3) = 2
links(4) = 4

'Esta função troca o valor de duas variáveis entre si.
'Opcional. Pode ser embutido na bolha
function swap(i, j)
    valor_1_antigo = links(i)
    valor_2_antigo = links(j)

    links(i) = valor_2_antigo
    links(j) = valor_1_antigo
end Function
   
'A BOLHA
for i = 0 to UBound(links)
    for j = i+1 to UBound(links)
        if (links(i) > links(j)) then
            call swap(i, j) 'Passa o ponteiro para a funcao swap
        end if
    next
next

'Resultado
for i = 0 to UBound(links)
    Response.write links(i) & " "
next
%>

Visual Basic
Private Sub sbOrdena(aNumbers() As Integer)
    Dim iNumber1 As Integer
    Dim iNumber2 As Integer
    Dim iNumberAux As Integer
   
    For iNumber1 = 0 To UBound(aNumbers)
        For iNumber2 = 0 To UBound(aNumbers) - 1
            If aNumbers(iNumber2) > aNumbers(iNumber2 + 1) Then
                iNumberAux = aNumbers(iNumber2)
                aNumbers(iNumber2) = aNumbers(iNumber2 + 1)
                aNumbers(iNumber2 + 1) = iNumberAux
            End If
        Next iNumber2
    Next iNumber1
End Sub

Nenhum comentário:

Postar um comentário

Poderá gostar também de

Related Posts Plugin for WordPress, Blogger...

Ocioso

  ©Template by Dicas Blogger.

TOPO