Java常用算法分析

一  插入排序法:
说明: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

Java代码 复制代码

  1. public class InsertSorter > extends Sorter {  
    1. /**
    2.      * from  起始位置
    3.      * len   从起始位置开始 需要比较的次数
    4.      */
    5. public void sort(E[] array, int from, int len) {  
    6.          E tmp=null;  
    7. for(int i=from+1;i
    8.               tmp=array[i];  
    9. int j=i;  
    10. for(;j>from;j--){  
    11. if(tmp.compareTo(array[j-1])<0){  
    12.                       array[j]=array[j-1];  
    13.                   }  
    14. else break;  
    15.               }  
    16.               array[j]=tmp;  
    17.           }  
    18.     }  
public class InsertSorter
 
 
  
  > extends Sorter
  
  
   
    {

    /**
     * from  起始位置
     * len   从起始位置开始 需要比较的次数
     */
    public void sort(E[] array, int from, int len) {
         E tmp=null;
          for(int i=from+1;i
   
   
    
    from;j--){
                  if(tmp.compareTo(array[j-1])<0){
                      array[j]=array[j-1];
                  }
                  else break;
              }
              array[j]=tmp;
          }
    }
}
   
   
  
  
 
 

二  冒泡排序法:

说明: 算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)

Java代码 复制代码

  1. public class BubbleSorter > extends Sorter {  
  2. private static boolean DWON=true;  
  3. public final void bubble_down(E[] array, int from, int len)  
  4.     {  
  5. for(int i=from;i
  6.         {  
  7. for(int j=from+len-1;j>i;j--)  
  8.             {  
  9. if(array[j].compareTo(array[j-1])<0)  
  10.                 {  
  11.                     swap(array,j-1,j);  
  12.                 }  
  13.             }  
  14.         }  
  15.     }  
  16. public final void bubble_up(E[] array, int from, int len)  
  17.     {  
  18. for(int i=from+len-1;i>=from;i--)  
  19.         {  
  20. for(int j=from;j
  21.             {  
  22. if(array[j].compareTo(array[j+1])>0)  
  23.                 {  
  24.                     swap(array,j,j+1);  
  25.                 }  
  26.             }  
  27.         }  
  28.     }  
  29. @Override
  30. public void sort(E[] array, int from, int len) {  
  31. if(DWON)  
  32.         {  
  33.             bubble_down(array,from,len);  
  34.         }  
  35. else
  36.         {  
  37.             bubble_up(array,from,len);  
  38.         }  
  39.     }  
public class BubbleSorter
 
 
  
  > extends Sorter
  
  
   
    {

    private static  boolean DWON=true;
    
    public final void bubble_down(E[] array, int from, int len)
    {
        for(int i=from;i
   
   
    
    i;j--)
            {
                if(array[j].compareTo(array[j-1])<0)
                {
                    swap(array,j-1,j);
                }
            }
        }
    }
    
    public final void bubble_up(E[] array, int from, int len)
    {
        for(int i=from+len-1;i>=from;i--)
        {
            for(int j=from;j
    
    
     
     0)
                {
                    swap(array,j,j+1);
                }
            }
        }
    }
    @Override
    public void sort(E[] array, int from, int len) {
        
        if(DWON)
        {
            bubble_down(array,from,len);
        }
        else
        {
            bubble_up(array,from,len);
        }
    }
    
}
    
    
   
   
  
  
 
 

  选择排序法:

说明: 选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。

Java代码 复制代码

  1. public class SelectSorter > extends Sorter {  
  2. @Override
  3. public void sort(E[] array, int from, int len) {  
  4. for(int i=0;i
  5. int smallest=i;  
  6. int j=i+from;  
  7. for(;j
  8. if(array[j].compareTo(array[smallest])<0)  
  9.                         smallest=j;  
  10.                 }  
  11.                 swap(array,i,smallest);            
  12.             }  
  13.         }  

  选择排序法:

说明: 该方法只是通过遍历集合记录最小(大)元素的位置,一次遍历完后,再进行交换位置操作,类似冒泡,但在比较过程中,不进行交换操作,只记录元素位置。一次遍历只进行一次交换操作。这个对与交换次序比较费时的元素比较适合。这种排序法比冒泡法要城府要深的多,我先记住极端数据,待遍历数据完了之后,我再处理,不像冒泡法那样只要比自己极端一点的就要处理,选择法只处理本身范围内的最极端数据.

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排序:

说明: 它是对插入排序的一种改进,是考虑将集合元素按照一定的基数划分成组去排序,让每一组在局部范围内先排成基本有序,最后在进行一次所有元素的插入排序。
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);
}
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){
                  temp=data[j];
                  data[j]=data[j-inc] 
                  data[j-inc]=temp;
              } 
       }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值