Algoritmos de ordenação

Veja nesta dica quatro algoritmos de ordenação (Insertion Sort, Heap Sort, Merge Sort e Shell Sort)

Algoritmos de ordenação

 

Veja nesta dica quatro algoritmos de ordenação (Insertion Sort, Heap Sort, Merge Sort e Shell Sort)

 

1. Implementação do algoritmo Insertion Sort

 

<SPAN lang=EN-US >/**</SPAN>
<SPAN lang=EN-US >* Algoritmo Insertion Sort.</SPAN>
<SPAN lang=EN-US >*/</SPAN>
<B><SPAN lang=EN-US >public static void </SPAN></B><SPAN lang=EN-US >insertionSort( Comparable [ ] a )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >p = </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >; p < a.length; p++ )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<SPAN lang=EN-US >Comparable tmp = a[ p ];</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >j = p;</SPAN>

<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( ; j > </SPAN><SPAN lang=EN-US >0 </SPAN><SPAN lang=EN-US >&& tmp.compareTo( a[ j - </SPAN><SPAN lang=EN-US >1 </SPAN><SPAN lang=EN-US >] ) < </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >; j-- )</SPAN>
<SPAN lang=EN-US >a[ j ] = a[ j - </SPAN><SPAN lang=EN-US >1 </SPAN><SPAN lang=EN-US >];</SPAN>
<SPAN lang=EN-US >a[ j ] = tmp;</SPAN>
<SPAN lang=EN-US >}</SPAN>
<SPAN lang=EN-US >}</SPAN>

 

 

2. Implementação do algoritmo Heap Sort

 

<SPAN lang=EN-US >/**</SPAN>
<SPAN lang=EN-US >* Algoritmo Heap Sort.</SPAN>
<SPAN lang=EN-US >*/</SPAN>
<B><SPAN lang=EN-US >public static void </SPAN></B><SPAN lang=EN-US >heapsort( Comparable [ ] a )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >i = a.length / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >; i >= </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >; i-- )  </SPAN><SPAN lang=EN-US >/* buildHeap */</SPAN>
<SPAN lang=EN-US >percDown( a, i, a.length );</SPAN>
<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >i = a.length - </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >; i > </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >; i-- )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<SPAN lang=EN-US >swapReferences( a, </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, i );            </SPAN><SPAN lang=EN-US >/* deleteMax */</SPAN>
<SPAN lang=EN-US >percDown( a, </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, i );</SPAN>
<SPAN lang=EN-US >}</SPAN>
<SPAN lang=EN-US >}</SPAN>

<B><SPAN lang=EN-US >private static int </SPAN></B><SPAN lang=EN-US >leftChild( </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >i )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<B><SPAN lang=EN-US >return </SPAN></B><SPAN lang=EN-US >2 </SPAN><SPAN lang=EN-US >* i + </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >;</SPAN>
<SPAN lang=EN-US >}</SPAN>

<B><SPAN lang=EN-US >private static void </SPAN></B><SPAN lang=EN-US >percDown( Comparable [ ] a, </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >i, </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >n )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >child;</SPAN>
<SPAN lang=EN-US >Comparable tmp;</SPAN>

<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( tmp = a[ i ]; leftChild( i ) < n; i = child )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<SPAN lang=EN-US >child = leftChild( i );</SPAN>
<B><SPAN lang=EN-US >if</SPAN></B><SPAN lang=EN-US >( child != n - </SPAN><SPAN lang=EN-US >1 </SPAN><SPAN lang=EN-US >&& a[ child ].compareTo( a[ child + </SPAN><SPAN lang=EN-US >1 </SPAN><SPAN lang=EN-US >] ) < </SPAN><SPAN lang=EN-US >0 </SPAN><SPAN lang=EN-US >)</SPAN>
<SPAN lang=EN-US >child++;</SPAN>
<B><SPAN lang=EN-US >if</SPAN></B><SPAN lang=EN-US >( tmp.compareTo( a[ child ] ) < </SPAN><SPAN lang=EN-US >0 </SPAN><SPAN lang=EN-US >)</SPAN>
<SPAN lang=EN-US >a[ i ] = a[ child ];</SPAN>
<B><SPAN lang=EN-US >else</SPAN></B>
<B><SPAN lang=EN-US >break</SPAN></B><SPAN lang=EN-US >;</SPAN>
<SPAN lang=EN-US >}</SPAN>
<SPAN lang=EN-US >a[ i ] = tmp;</SPAN>
<SPAN lang=EN-US >}</SPAN>


<SPAN lang=EN-US >/**</SPAN>
<SPAN lang=EN-US >* Method para trocar elementos em um array.</SPAN>
<SPAN lang=EN-US >*/</SPAN>
<B><SPAN lang=EN-US >public static final void </SPAN></B><SPAN lang=EN-US >swapReferences( Object [ ] a, </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >index1, </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >index2 )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<SPAN lang=EN-US >Object tmp = a[ index1 ];</SPAN>
<SPAN lang=EN-US >a[ index1 ] = a[ index2 ];</SPAN>
<SPAN lang=EN-US >a[ index2 ] = tmp;</SPAN>
<SPAN lang=EN-US >}</SPAN>

 

 

3. Implementação do algoritmo Merge Sort

 

<SPAN >/**</SPAN>
<SPAN >* Algoritmo Merge Sort.</SPAN>
<SPAN lang=EN-US >*/</SPAN>
<B><SPAN lang=EN-US >public static void </SPAN></B><SPAN lang=EN-US >mergeSort( Comparable [ ] a ) {</SPAN>
<SPAN lang=EN-US >Comparable [ ] tmpArray = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Comparable[ a.length ];</SPAN>
<SPAN lang=EN-US >mergeSort( a, tmpArray, </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, a.length - </SPAN><SPAN lang=EN-US >1 </SPAN><SPAN lang=EN-US >);</SPAN>
<SPAN lang=EN-US >}</SPAN>

<SPAN lang=EN-US >/**</SPAN>
<SPAN lang=EN-US >* Método interno que faz chamadas recursivas</SPAN>
<SPAN lang=EN-US >*/</SPAN>
<B><SPAN lang=EN-US >private static void </SPAN></B><SPAN lang=EN-US >mergeSort( Comparable [ ] a, Comparable [ ] tmpArray,</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >left, </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >right ) {</SPAN>
<B><SPAN lang=EN-US >if</SPAN></B><SPAN lang=EN-US >( left < right ) {</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >center = ( left + right ) / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >;</SPAN>
<SPAN lang=EN-US >mergeSort( a, tmpArray, left, center );</SPAN>
<SPAN lang=EN-US >mergeSort( a, tmpArray, center + </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >, right );</SPAN>
<SPAN lang=EN-US >merge( a, tmpArray, left, center + </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >, right );</SPAN>
<SPAN lang=EN-US >}</SPAN>
<SPAN lang=EN-US >}</SPAN>

<SPAN lang=EN-US >/**</SPAN>
<SPAN lang=EN-US >* Metódo interno que ordena duas partes de um subarray.</SPAN>
<SPAN lang=EN-US >*/</SPAN>
<B><SPAN lang=EN-US >private static void </SPAN></B><SPAN lang=EN-US >merge( Comparable [ ] a, Comparable [ ] tmpArray,</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >leftPos, </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >rightPos, </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >rightEnd ) {</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >leftEnd = rightPos - </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >;</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >tmpPos = leftPos;</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >numElements = rightEnd - leftPos + </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >;</SPAN>

<SPAN lang=EN-US >// loop principal</SPAN>
<B><SPAN lang=EN-US >while</SPAN></B><SPAN lang=EN-US >( leftPos <= leftEnd && rightPos <= rightEnd )</SPAN>
<B><SPAN lang=EN-US >if</SPAN></B><SPAN lang=EN-US >( a[ leftPos ].compareTo( a[ rightPos ] ) <= </SPAN><SPAN lang=EN-US >0 </SPAN><SPAN lang=EN-US >)</SPAN>
<SPAN lang=EN-US >tmpArray[ tmpPos++ ] = a[ leftPos++ ];</SPAN>
<B><SPAN lang=EN-US >else</SPAN></B>
<SPAN lang=EN-US >tmpArray[ tmpPos++ ] = a[ rightPos++ ];</SPAN>

<B><SPAN lang=EN-US >while</SPAN></B><SPAN lang=EN-US >( leftPos <= leftEnd )    </SPAN>
<SPAN lang=EN-US >tmpArray[ tmpPos++ ] = a[ leftPos++ ];</SPAN>

<B><SPAN lang=EN-US >while</SPAN></B><SPAN lang=EN-US >( rightPos <= rightEnd )  </SPAN>
<SPAN lang=EN-US >tmpArray[ tmpPos++ ] = a[ rightPos++ ];</SPAN>

<SPAN lang=EN-US >// Copiando o array temporário de volta</SPAN>
<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >i = </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >; i < numElements; i++, rightEnd-- )</SPAN>
<SPAN lang=EN-US >a[ rightEnd ] = tmpArray[ rightEnd ];</SPAN>
<SPAN lang=EN-US >}</SPAN>

 

 

4. Implementação do algoritmo Shell Sort

 

<SPAN lang=EN-US >/**</SPAN>
<SPAN lang=EN-US >* Algoritmo Shell Sort.</SPAN>
<SPAN lang=EN-US >*/</SPAN>

<B><SPAN lang=EN-US >public static void </SPAN></B><SPAN lang=EN-US >shellsort( Comparable [ ] a )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >gap = a.length / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >; gap > </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >;</SPAN>
<SPAN lang=EN-US >gap = gap == </SPAN><SPAN lang=EN-US >2 </SPAN><SPAN lang=EN-US >? </SPAN><SPAN lang=EN-US >1 </SPAN><SPAN lang=EN-US >: (</SPAN><B><SPAN lang=EN-US >int</SPAN></B><SPAN lang=EN-US >) ( gap / </SPAN><SPAN lang=EN-US >2.2 </SPAN><SPAN lang=EN-US >) )</SPAN>
<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >i = gap; i < a.length; i++ )</SPAN>
<SPAN lang=EN-US >{</SPAN>
<SPAN lang=EN-US >Comparable tmp = a[ i ];</SPAN>
<B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >j = i;</SPAN>

<B><SPAN lang=EN-US >for</SPAN></B><SPAN lang=EN-US >( ; j >= gap && tmp.compareTo( a[ j - gap ] ) < </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >; j -= gap )</SPAN>
<SPAN lang=EN-US >a[ j ] = a[ j - gap ];</SPAN>
<SPAN lang=EN-US >a[ j ] = tmp;</SPAN>
<SPAN lang=EN-US >}</SPAN>
<SPAN lang=EN-US >}</SPAN>

Artigos relacionados