各种排序算法java实现 
插入排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;
/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  InsertSort  implements  SortUtil.Sort {

    
/*  (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        
int  temp;
        
for ( int  i = 1 ;i < data.length;i ++ ) {
            
for ( int  j = i;(j > 0 ) && (data[j] < data[j - 1 ]);j -- ) {
                SortUtil.swap(data,j,j
- 1 );
            }

        }
        
    }


}

冒泡排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  BubbleSort  implements  SortUtil.Sort {

    
/*  (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        
int  temp;
        
for ( int  i = 0 ;i < data.length;i ++ ) {
            
for ( int  j = data.length - 1 ;j > i;j -- ) {
                
if (data[j] < data[j - 1 ]) {
                    SortUtil.swap(data,j,j
- 1 );
                }

            }

        }

    }


}


选择排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  SelectionSort  implements  SortUtil.Sort  {

    
/*
     * (non-Javadoc)
     * 
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        
int  temp;
        
for  ( int  i  =   0 ; i  <  data.length; i ++ {
            
int  lowIndex  =  i;
            
for  ( int  j  =  data.length  -   1 ; j  >  i; j -- {
                
if  (data[j]  <  data[lowIndex])  {
                    lowIndex 
=  j;
                }

            }

            SortUtil.swap(data,i,lowIndex);
        }

    }


}


Shell排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  ShellSort  implements  SortUtil.Sort {

    
/*  (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        
for ( int  i = data.length / 2 ;i > 2 ;i /= 2 ) {
            
for ( int  j = 0 ;j < i;j ++ ) {
                insertSort(data,j,i);
            }

        }

        insertSort(data,
0 , 1 );
    }


    
/**
     * 
@param  data
     * 
@param  j
     * 
@param  i
     
*/

    
private   void  insertSort( int [] data,  int  start,  int  inc)  {
        
int  temp;
        
for ( int  i = start + inc;i < data.length;i += inc) {
            
for ( int  j = i;(j >= inc) && (data[j] < data[j - inc]);j -= inc) {
                SortUtil.swap(data,j,j
- inc);
            }

        }

    }


}


快速排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  QuickSort  implements  SortUtil.Sort {

    
/*  (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        quickSort(data,
0 ,data.length - 1 );        
    }

    
private   void  quickSort( int [] data, int  i, int  j) {
        
int  pivotIndex = (i + j) / 2 ;
        
// swap
        SortUtil.swap(data,pivotIndex,j);
        
        
int  k = partition(data,i - 1 ,j,data[j]);
        SortUtil.swap(data,k,j);
        
if ((k - i) > 1 ) quickSort(data,i,k - 1 );
        
if ((j - k) > 1 ) quickSort(data,k + 1 ,j);
        
    }

    
/**
     * 
@param  data
     * 
@param  i
     * 
@param  j
     * 
@return
     
*/

    
private   int  partition( int [] data,  int  l,  int  r, int  pivot)  {
        
do {
           
while (data[ ++ l] < pivot);
           
while ((r != 0 ) && data[ -- r] > pivot);
           SortUtil.swap(data,l,r);
        }

        
while (l < r);
        SortUtil.swap(data,l,r);        
        
return  l;
    }


}

改进后的快速排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  ImprovedQuickSort  implements  SortUtil.Sort  {

    
private   static   int  MAX_STACK_SIZE = 4096 ;
    
private   static   int  THRESHOLD = 10 ;
    
/*  (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        
int [] stack = new   int [MAX_STACK_SIZE];
        
        
int  top =- 1 ;
        
int  pivot;
        
int  pivotIndex,l,r;
        
        stack[
++ top] = 0 ;
        stack[
++ top] = data.length - 1 ;
        
        
while (top > 0 ) {
            
int  j = stack[top -- ];
            
int  i = stack[top -- ];
            
            pivotIndex
= (i + j) / 2 ;
            pivot
= data[pivotIndex];
            
            SortUtil.swap(data,pivotIndex,j);
            
            
// partition
            l = i - 1 ;
            r
= j;
            
do {
                
while (data[ ++ l] < pivot);
                
while ((r != 0 ) && (data[ -- r] > pivot));
                SortUtil.swap(data,l,r);
            }

            
while (l < r);
            SortUtil.swap(data,l,r);
            SortUtil.swap(data,l,j);
            
            
if ((l - i) > THRESHOLD) {
                stack[
++ top] = i;
                stack[
++ top] = l - 1 ;
            }

            
if ((j - l) > THRESHOLD) {
                stack[
++ top] = l + 1 ;
                stack[
++ top] = j;
            }

            
        }

        
// new InsertSort().sort(data);
        insertSort(data);
    }

    
/**
     * 
@param  data
     
*/

    
private   void  insertSort( int [] data)  {
        
int  temp;
        
for ( int  i = 1 ;i < data.length;i ++ ) {
            
for ( int  j = i;(j > 0 ) && (data[j] < data[j - 1 ]);j -- ) {
                SortUtil.swap(data,j,j
- 1 );
            }

        }
       
    }


}


归并排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  MergeSort  implements  SortUtil.Sort {

    
/*  (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        
int [] temp = new   int [data.length];
        mergeSort(data,temp,
0 ,data.length - 1 );
    }

    
    
private   void  mergeSort( int [] data, int [] temp, int  l, int  r) {
        
int  mid = (l + r) / 2 ;
        
if (l == r)  return  ;
        mergeSort(data,temp,l,mid);
        mergeSort(data,temp,mid
+ 1 ,r);
        
for ( int  i = l;i <= r;i ++ ) {
            temp[i]
= data[i];
        }

        
int  i1 = l;
        
int  i2 = mid + 1 ;
        
for ( int  cur = l;cur <= r;cur ++ ) {
            
if (i1 == mid + 1 )
                data[cur]
= temp[i2 ++ ];
            
else   if (i2 > r)
                data[cur]
= temp[i1 ++ ];
            
else   if (temp[i1] < temp[i2])
                data[cur]
= temp[i1 ++ ];
            
else
                data[cur]
= temp[i2 ++ ];            
        }

    }


}


改进后的归并排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  ImprovedMergeSort  implements  SortUtil.Sort  {

    
private   static   final   int  THRESHOLD  =   10 ;

    
/*
     * (non-Javadoc)
     * 
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        
int [] temp = new   int [data.length];
        mergeSort(data,temp,
0 ,data.length - 1 );
    }


    
private   void  mergeSort( int [] data,  int [] temp,  int  l,  int  r)  {
        
int  i, j, k;
        
int  mid  =  (l  +  r)  /   2 ;
        
if  (l  ==  r)
            
return ;
        
if  ((mid  -  l)  >=  THRESHOLD)
            mergeSort(data, temp, l, mid);
        
else
            insertSort(data, l, mid 
-  l  +   1 );
        
if  ((r  -  mid)  >  THRESHOLD)
            mergeSort(data, temp, mid 
+   1 , r);
        
else
            insertSort(data, mid 
+   1 , r  -  mid);

        
for  (i  =  l; i  <=  mid; i ++ {
            temp[i] 
=  data[i];
        }

        
for  (j  =   1 ; j  <=  r  -  mid; j ++ {
            temp[r 
-  j  +   1 =  data[j  +  mid];
        }

        
int  a  =  temp[l];
        
int  b  =  temp[r];
        
for  (i  =  l, j  =  r, k  =  l; k  <=  r; k ++ {
            
if  (a  <  b)  {
                data[k] 
=  temp[i ++ ];
                a 
=  temp[i];
            }
  else   {
                data[k] 
=  temp[j -- ];
                b 
=  temp[j];
            }

        }

    }


    
/**
     * 
@param  data
     * 
@param  l
     * 
@param  i
     
*/

    
private   void  insertSort( int [] data,  int  start,  int  len)  {
        
for ( int  i = start + 1 ;i < start + len;i ++ ) {
            
for ( int  j = i;(j > start)  &&  data[j] < data[j - 1 ];j -- ) {
                SortUtil.swap(data,j,j
- 1 );
            }

        }

    }


}

堆排序:

package  org.rut.util.algorithm.support;

import  org.rut.util.algorithm.SortUtil;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  HeapSort  implements  SortUtil.Sort {

    
/*  (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     
*/

    
public   void  sort( int [] data)  {
        MaxHeap h
= new  MaxHeap();
        h.init(data);
        
for ( int  i = 0 ;i < data.length;i ++ )
            h.remove();
        System.arraycopy(h.queue,
1 ,data, 0 ,data.length);
    }



     
private   static   class  MaxHeap {
         
        
        
void  init( int [] data) {
            
this .queue = new   int [data.length + 1 ];
            
for ( int  i = 0 ;i < data.length;i ++ ) {
                queue[
++ size] = data[i];
                fixUp(size);
            }

        }

         
        
private   int  size = 0 ;

        
private   int [] queue;
                
        
public   int  get()  {
            
return  queue[ 1 ];
        }


        
public   void  remove()  {
            SortUtil.swap(queue,
1 ,size -- );
            fixDown(
1 );
        }

        
// fixdown
         private   void  fixDown( int  k)  {
            
int  j;
            
while  ((j  =  k  <<   1 <=  size)  {
                
if  (j  <  size  &&  queue[j] < queue[j + 1 ])
                    j
++
                
if  (queue[k] > queue[j])  // 不用交换
                     break ;
                SortUtil.swap(queue,j,k);
                k 
=  j;
            }

        }

        
private   void  fixUp( int  k)  {
            
while  (k  >   1 {
                
int  j  =  k  >>   1 ;
                
if  (queue[j] > queue[k])
                    
break ;
                SortUtil.swap(queue,j,k);
                k 
=  j;
            }

        }


    }


}


 

SortUtil:

package  org.rut.util.algorithm;

import  org.rut.util.algorithm.support.BubbleSort;
import  org.rut.util.algorithm.support.HeapSort;
import  org.rut.util.algorithm.support.ImprovedMergeSort;
import  org.rut.util.algorithm.support.ImprovedQuickSort;
import  org.rut.util.algorithm.support.InsertSort;
import  org.rut.util.algorithm.support.MergeSort;
import  org.rut.util.algorithm.support.QuickSort;
import  org.rut.util.algorithm.support.SelectionSort;
import  org.rut.util.algorithm.support.ShellSort;

/**
 * 
@author  treeroot
 * 
@since  2006-2-2
 * 
@version  1.0
 
*/

public   class  SortUtil  {
    
public   final   static   int  INSERT  =   1 ;

    
public   final   static   int  BUBBLE  =   2 ;

    
public   final   static   int  SELECTION  =   3 ;

    
public   final   static   int  SHELL  =   4 ;

    
public   final   static   int  QUICK  =   5 ;

    
public   final   static   int  IMPROVED_QUICK  =   6 ;

    
public   final   static   int  MERGE  =   7 ;

    
public   final   static   int  IMPROVED_MERGE  =   8 ;

    
public   final   static   int  HEAP  =   9 ;

    
public   static   void  sort( int [] data)  {
        sort(data, IMPROVED_QUICK);
    }

    
private   static  String[] name = {
            
" insert " , " bubble " , " selection " , " shell " , " quick " , " improved_quick " , " merge " , " improved_merge " , " heap "
    }
;
    
    
private   static  Sort[] impl = new  Sort[] {
            
new  InsertSort(),
            
new  BubbleSort(),
            
new  SelectionSort(),
            
new  ShellSort(),
            
new  QuickSort(),
            
new  ImprovedQuickSort(),
            
new  MergeSort(),
            
new  ImprovedMergeSort(),
            
new  HeapSort()
    }
;

    
public   static  String toString( int  algorithm) {
        
return  name[algorithm - 1 ];
    }

    
    
public   static   void  sort( int [] data,  int  algorithm)  {
        impl[algorithm
- 1 ].sort(data);
    }


    
public   static   interface  Sort  {
        
public   void  sort( int [] data);
    }


    
public   static   void  swap( int [] data,  int  i,  int  j)  {
        
int  temp  =  data[i];
        data[i] 
=  data[j];
        data[j] 
=  temp;
    }

}

posted on 2006-12-15 16:06 jackstudio 阅读(430) 评论(0)  编辑  收藏 所属分类: commonjava

只有注册用户登录后才能发表评论。


网站导航: