java實現 數據結構之8大排序

數據結構中8大排序(java方式實現)
 
    
        * 冒泡排序
        * 插入排序
        * 選擇排序
        * shell排序
        * 堆排序
        * 歸併排序
        * 二叉樹排序
        * 快速排序
 
    * 冒泡排序
 
     private void bubblesort() {
           int data [] = create();
           print (data );
           long start = start ();
           forint i =0 ; i< data .length - 1; i ++){
               forint j =i + 1; j <data . length; j ++){
                    if( data [i ]> data[ j ])
                         swap (i , j, data );
               }
           }
           end (start , "冒泡" );
           print (data );
      }
     private void swap( int i , int j , int [] data ) {
           int temp = 0 ;
          temp = data[ i ];
          data [ i] = data [ j];
          data [ j] = temp ;
      }
      public static long start (){
           return   System.currentTimeMillis ();
      }
      public static void  end (long start , String str ){
           long end = System.currentTimeMillis();
          System . out. println (str + "排序花費的時間  = "+( end- start ));
      }
 
     static int [] create () {
           int array [] = new int1000];
           forint i =0 ; i< 1000 ; i ++){
               try {
                   Thread . sleep( 1 );
               catch (InterruptedException e ) {
                    // TODO Auto-generated catch block
                   e . printStackTrace();
               }
              array [ i] = new Random (). nextInt( 100000 );
           }
           return array;
      }
 
    * 插入排序
 
     private void insertsort() {
           int data [] = create();
           print (data );
           long start = start ();
           int temp = 0 , j = 0;
           forint i =0 ; i< data .length ; i++){
              temp = data[ i ];
              j = i- 1 ;
               while( j >=0 && data[ j ]>temp ){
                   data [ j+ 1 ] = data[ j ];
                   j --;
               }
              data [ j+ 1 ] = temp;
           }
           end (start , "插入" );
           print (data );
      }
 
    * 選擇排序
 
     private void selectsort() {
           int data [] = create();
           print (data );
           int k =0 ;
           long start = start ();
           forint i =0 ; i< data .length - 1; i ++){
              k = i;
               forint j =i + 1; j <data . length; j ++){
                    if( data [k ]> data[ j ]){
                        k = j;
                    }
               }
               swap (i , k, data );
           }
           end (start , "選擇" );
           print (data );
      }
 
    * shell 排序
 
private void shellsort() {
           int data [] = create();
           print (data );
           long start = start ();
           int j = 0 ;
           int temp = 0 ;
           int gap = 0 ;
           int n = data . length;
           while( gap <data . length){
              gap = gap* 3 +1 ;
           }
           
           while( gap >0 ){
               forint i =gap ; i< n ; i ++){
                   j = i- gap ;
                   temp = data[ i ];
                    while( j >=0 && data[ j ]>temp ){
                        data [ j+ gap ] = data[ j ];
                        j = j- gap ;
                    }
                   data [ j+ gap ] = temp;
               }
              gap = ( gap -1 )/ 3;
               
               
           }
           print (data );
           end (start , "shell" );
      }
 
    * 堆排序
 
     public   void heapsort() {
           int data [] = create();
           print (data );
           long start = start ();
           crateheap (data );
           forint i =data . length- 1 ; i >= 1; i --){
               swap (i , 0, data );
               heapfiy (data , 0, i );
           }
           end (start , "堆" );
           print (data );
      }
     private void crateheap( int[] data ) {
           int n = data . length;
           forint i =n / 21 ; i > 0; i --){
               heapfiy (data , i, n );
           }
           
      }
     private void heapfiy( int[] data , int i, int n ) {
           int left = i * 21 ;
           int right = i * 22 ;
           int large = 0 ;
           if( left <n && data[ left ]>data [ i])
              large = left;
           else
              large = i;
           if( right <n && data[ right ]>data [ large])
              large = right;
           if( large !=i ){
               swap (large , i, data );
               heapfiy (data , large, n );
           }
      }
 
    * 歸併排序
 
     public   void mergesort() {
           int data [] = create();
           print (data );
           long start = start ();
           merge (data , 0, data .length - 1);
           end (start , "歸併" );
           print (data );
      }
     public void merge( int data [],int low ,int high){
           int mid = ( low+ high )/2 ;
           if( low <high ){
           merge (data , low, mid );
           merge (data , mid+ 1 , high );
           merge1 (data , low, mid , high );
           }
      }
     private void merge1( int[] data , int low, int mid , int high ) {
           int temp [] = new int [ high -low + 1];
           int i = low ;
           int j = mid + 1;
           int k = 0 ;
           while( i <=mid && j<= high ){
               if( data [i ]< data[ j ]){
                   temp [ k++] = data [ i++];
               }else {
                   temp [ k++] = data [ j++];
               }
           }
           
           while( i <=mid ){
              temp [ k++] = data [ i++];
           }
           while( j <=high ){
              temp [ k++] = data [ j++];
           }
           
           forint k2 =0 ; k2< temp .length ; k2++){
              data [ k2+ low ] = temp[ k2 ];
           }
           
      }
 
    * 二叉樹排序
 
public class BinaryTree {
      int data ;       //根節點數據
      BinaryTree left ;    //左子樹
      BinaryTree right ;   //右子樹
      public BinaryTree( int data)     //實例化二叉樹類
      {
       this. data = data ;
       left = null;
       right = null;
      }
      public void insert( BinaryTree root, int data ){     //向二叉樹中插入子節點
            if( data >root . data)                                //二叉樹的左節點都比根節點小
            {
             if( root .right ==null ){
              root . right = new BinaryTree( data );
             }else {
              this. insert (root . right, data );
             }
            }else {                                          //二叉樹的右節點都比根節點大
             if( root .left ==null ){
              root . left = new BinaryTree( data );
             }else {
              this. insert (root . left, data );
             }
            }
           }
      
}
  public static void inOrder( BinaryTree root ){     
 
            if( root !=null){
             inOrder (root . left);
             System . out. print (root . data+ "--" );
             inOrder (root . right);
            }
           }
 
    * 快速排序
 
     public void quicksort() {
           int data [] = create();
           print (data );
           long start = start ();
           quick1 (data , 0, data .length - 1);
           end (start , "快速" );
           print (data );
      }
     public int [] quick1 (int data [],int left, int right ){
           int mid ;
           if( left <right ){
              mid = quick ( data, left , right );
               quick1 (data , left, mid -1 );
               quick1 (data , mid+ 1 , right );
           }
           return data;
      }
     private int quick( int[] data , int left, int right ) {
           int mid = data [ left];
           while( left <right ){
               while( left <right && data[ right ]>=mid )
                   right --;
              data [ left] = data [ right];
               
               while( left <right && data[ left ]<=mid )
                   left ++;
              data [ right] = data [ left];
           }
           
          data [ left] = mid ;
           
           return left;
      }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章