アルゴリズムの泡の順序付けについての奮闘史

20559 ワード


//     --     
    void bubble(int[] array){
          if(array==null){
              return;
          }
          if(array.length<=1){
              return;
          }

//                   :(           )                  
//         : 0 5 3 7 6
//              ,    0 3 5 6   7
//             :       0 3  5     6 7
          for(int i=0;i<array.length-1;i++){
              for(int j=0;j<array.length-1;j++){
                  if(array[j]>array[j+1]){
                      swap(array,j,j+1);
                  }
              }
          }
    }
    

//       
//       ,     ,         ,         (n-1)*(n-1)      
    void buddle2(int []array){
        if(array==null){
            return;
        }
        if(array.length<=1){
            return;
        }

        boolean is_again=false;
        for(int i=0;i<array.length-1;i++){
            for(int j=0;j<array.length-1;j++){
                if(array[j]>array[j+1]){
                    swap(array,j,j+1);
                    is_again=true;
                }
            }
            if(!is_again){
                return;
            }
        }
    }


//            
//       ,                   ,          
    void buddle3(int[] array){
        if(array==null){
            return;
        }
        if(array.length<=1){
            return;
        }

        int cur_end=array.length-1;
        int record=0;
        boolean is_again=false;
        for(int i=0;i<array.length-1;i++){
            for(int j=0;j<cur_end;j++){
                if(array[j]>array[j+1]){
                    swap(array,j,j+1);
                    is_again=true;
                    record=j;
                }
            }
            cur_end=record;
            if(!is_again){
                return;
            }
        }
    }


//    ,                  ,                 
    void buddle(int [] array){
        if(array==null){
            return;
        }
        if(array.length<=1){
            return;
        }


        int cur_start=0;
        int cur_end=array.length-1;
        int record_start=0;
        int record_end=0;
        boolean is_again=false;
        for(int i=0;i<array.length/2;i++){
            for(int j=cur_start;j<cur_end;j++){
                if(array[j]>array[j+1]){
                    swap(array,j,j+1);
                    is_again=true;
                    record_end=j;
                }
            }
            if(!is_again){
                return;
            }
            is_again=fale;
            cur_end=record_end;
            for(int j=cur_end;j>cur_start;j--){
                if(array[j]<array[j-1]){
                    swap(array,j,j+1);
                    is_again=true;
                    record_start=j;
                }
            }
            cur_start=record_start;
             if(!is_again){
                return;
            }
        }
    }

    private void swap(int[] arr, int i, int j){
        int tmp=arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;
    }