JAVA实现八种排序学习

public class SortClass {
public static final String MAX_TO_SMALL="max_to_small";//由大到小
public static final String SMALL_TO_MAX="small_to_max";//由小到大
 /**
  *[一] 直接插入排序
  * 基本思想:在要排序的一组数中,假设前面n-1,n>=2个数是已经排好顺序的
  * ,现在要把第n个数插入前面的有序数中,使得这n个数也是排序好的。如此反复
  * 直到全部排序好
  */
  void insert_sort(String type){
    int[] a={49,38,65,97,76,13,27};  
    int temp=0;
    System.out.println("insert_sort 直接插入排序前:"+Arrays.toString(a));
    if(type.equals(SMALL_TO_MAX)){//由小到大
        for(int i=1;i<a.length;i++){
            int j=i-1;
            temp=a[i];
            for(;j>=0 && temp<a[j];j--){
                a[j+1]=a[j];
            }
            a[j+1]=temp;
            
        }
    }
    if(type.equals(MAX_TO_SMALL)){//由大到小
        for(int i=1;i<a.length;i++){
            int j=i-1;
            temp=a[i];
            for(;j>=0 && temp>a[j];j--){
                a[j+1]=a[j];
            }
            a[j+1]=temp;
            
        }
    }
    
    System.out.println("insert_sort 直接插入排序后:"+Arrays.toString(a));
  }
 
  /**
   * [二]希尔排序(最小增量排序)
   * 基本思想:将要排序的一组数按某个增量d(n/2,n为要排序的个数)
   * 分成若干组,每组中记录的下标相差d,对每组中全部元素进行直接插入排序
   * 然后再用一个较小的增量(d/2)对它进行分组,再没组中再进行直接排序。
   * 当增量减到1时,进行直接排序后,排序完成。
   * @param type
   */
  void sell_sort(String type){
     int [] a={1,54,6,3,78,34,12,45,56,100};
     double d1=a.length;
     int temp=0;
     System.out.println("sell_sort 排序前:"+Arrays.toString(a));
    
//     while(true){
//         d1=Math.ceil(d1/2);
//         int d=(int)d1;
//         for(int x=0;x<d;x++){
//             for(int i=x+d;i<a.length;i+=d){
//                 int j=i-d;
//                 temp=a[i];
//                 if(type.equals(SMALL_TO_MAX)){//由小到大
//                     for(;j>=0 && temp<a[j];j-=d){
//                         a[j+d]=a[j];
//                     }
//                 }
//                 if(type.equals(MAX_TO_SMALL)){//由大到小
//                     for(;j>=0 && temp>a[j];j-=d){
//                         a[j+d]=a[j];
//                     }
//                 }
//                
//                 a[j+d]=temp;
//             }
//         }
//         if(d==1){
//             break;
//         }
//        
//     }
     while(true){
         d1=Math.ceil(d1/2);
         int d=(int)d1;
         for(int i=0;i<d;i++){
             for(int j=i;j+d<a.length;j+=d){
                
                 if(a[j]>a[j+d]){
                     temp=a[j];
                     a[j]=a[j+d];
                     a[j+d]=temp;
                 }
             }
         }
         if(d==1){
             break;
         }
         d--;
     }
     System.out.println("sell_sort 排序后:"+Arrays.toString(a));
  }
  /**
   * [三]简单选择排序
   * 基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;
   * 然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数
   * 比较为止。
   * @param type
   */
  void select_sort(String type){
      int[] a={1,54,3,78,34,23,45};
      System.out.println("select_sort排序前:"+Arrays.toString(a));
      int position=0;
      for(int i=0;i<a.length;i++){
          int j=i+1;
          position=i;
          int temp=a[i];
          if(type.equals(MAX_TO_SMALL)){
              for(;j<a.length;j++){
                  if(a[j]>temp){
                      temp=a[j];
                      position=j;
                  }
              }
          }
          if(type.equals(SMALL_TO_MAX)){
              for(;j<a.length;j++){
                  if(a[j]<temp){
                      temp=a[j];
                      position=j;
                  }
              }
          }
        
          a[position]=a[i];
          a[i]=temp;
          
      }
      System.out.println("select_sort 排序后:"+Arrays.toString(a));
  }
 
  /**
   * [四]堆排序:
   * 基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。
   * 堆排序的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)
   * 或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)时称为堆。在这里只讨论满足前者条件为堆。由堆的定义可以看出,堆元素
   * (即第一个元素)必选为最大顶!完全二叉树可以很直观第表示堆的结构。堆定位根,其它为左子树,右子树。初时
   * @param type
   */
  void heap_sort(String type){
      
  }
 
 
  /**
   * [五]冒泡排序:
   * 要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数
   * 依次进行比较和调整,让较大的数往下沉,较小的数据往上冒
   * 对n个元素进行冒泡排序,总共需要进行n-1趟。
   * 第1趟需要比较n-1次,第2趟需要比较n-2次,......第i趟需要比较n-i次。
   * @param a
   * @param ac
   */
  void bubble_sort(String type){
     int[] a={1,54,6,3,78,34,12,45,99};
     System.out.println("buble_sort 排序前:"+Arrays.toString(a));
     int temp=0;
     if(type.equals(SMALL_TO_MAX)){//由小到大
         for(int i=0;i<a.length-1;i++){//趟数
             for(int j=0;j<a.length-1-i;j++){//次数
                 if(a[j]>a[j+1]){
                     temp=a[j];
                     a[j]=a[j+1];
                     a[j+1]=temp;
                 }
             }
         }
     }
     if(type.equals(MAX_TO_SMALL)){//由大到小
         for(int i=0;i<a.length-1;i++){//趟数
             for(int j=0;j<a.length-1-i;j++){//次数
                 if(a[j]<a[j+1]){
                     temp=a[j];
                     a[j]=a[j+1];
                     a[j+1]=temp;
                 }
                
             }
            
         }
     }
     System.out.println("buble_sort 排序后:"+Arrays.toString(a));
  }
 
  /**
   *[七]快速排序
   *基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将
   *待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排序好
   *后的正确位置,然后再用同样方法递归排序划分两部分。
   * @param type
   */
  void quick_sort(String type){
      int[] a={49,38,65,97,76,13,27,49,78,34,12,64,5,62,99,98,
              54,56,17,18,23,34,15,35,25,53,51};
      System.out.println("quick_sort 排序前:"+Arrays.toString(a));
      
  }
 
 
 
  public static void main(String[] args) {
      SortClass s=new SortClass();
      s.select_sort(MAX_TO_SMALL);
      //s.insert_sort("max_to_small");
//     System.out.println( Math.ceil(13/2));
  }
}

posted @ 2016-04-15 16:17  IT一族  阅读(129)  评论(0编辑  收藏  举报