排序 一

1冒泡排序

传统冒泡排序
  

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

 




时间复杂度O(n^2),只需一个额外空间O(1),稳定

传统冒泡排序有一个缺点,不管数据是否已经排序完成都会固定执行n(n-1)/2次,
我们可以在程序中加入判断来判断何时可以提前中断程序,提高效率

public static void bubble(int[] arr){
        int temp;
        
        for(int i=arr.length-1;i>0;i--){
            int flag=0;  //flag用来判断是否有执行交换的动作
            for(int j=0;j<i;j++){
                if(arr[j]>arr[j+1]){
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                    flag++;          //如果有交换,flag不为0
                }    
                
            }
            if(flag==0){
                break;
            }    //当一次扫描判断后flag==0,没有交换动作,说明以完成排序,所以直接跳出循环
        }
    }

 




2选择排序法
时间复杂度O(n^2),只需一个额外空间O(1),不稳定
  

 public static void select(int[] arr){
        int tmp;
     for(int i=0;i<arr.length-1;i++){
        
         for(int j=i+1;j<arr.length;j++)
         {
             if(arr[j]<arr[i]){
                 tmp=arr[j];
                  arr[j]= arr[i];
                  arr[i]=tmp;
             }
         }
        
     }
    
    }

 


    
3插入排序
时间复杂度O(n),只需一个额外空间O(1),稳定,会造成数据的大量搬移,建议在链表上使用
 

public static void insert(int[] arr){
        int i,j;
        for(i=1;i<arr.length;i++)
        {    
            int tmp=arr[i];
            for(j=i-1;j>=0&&tmp<arr[j];j--){
                arr[j+1]=arr[j];
            }
            arr[j+1]=tmp;
        }
    }
    

   
4快速排序

快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n ^2)。

package example;

 
class Demo{
    

public static void main(String args[]) {  
    int[] arr={26,17,5,33,87,53,27,49,28,78};
    quick(arr,arr.length,0,arr.length-1);
    System.out.println("排序结果:");
    for(int a:arr){
        System.out.print(a+" ");
    }
    
 }

private static void quick(int[] arr, int length, int i, int j) {
    int left;
    int right;
    int tmp;
    if(i<j){
        left=i+1;
        right=j;
        while(true){
            System.out.print("处理过程"+": ");
            for(int t=0;t<length;t++)
                System.out.print("["+arr[t]+"]");
            System.out.print("\n");
            for(int x=i+1;x<=j;x++){
                if(arr[x]>arr[i]){
                    left=x;
                    break;
                }
                left++;
            }
            for(int y=j;y>=i+1;y--){
                if(arr[y]<arr[i]){
                    right=y;
                    break;
                }
                right--;
            }
            if(left<right){
                tmp=arr[right];
                arr[right]=arr[left];
                arr[left]=tmp;
            }
            else{
                break;
            }
            
            
        }
        if(left>=right){
            tmp=arr[i];
            arr[i]=arr[right];
            arr[right]=tmp;
            quick(arr,length,i,right-1);
            quick(arr,length,right+1,j);
            
            
            
        }
        
    }
}
}

处理过程: [26][17][5][33][87][53][27][49][28][78]
处理过程: [5][17][26][33][87][53][27][49][28][78]
处理过程: [5][17][26][33][87][53][27][49][28][78]
处理过程: [5][17][26][33][28][53][27][49][87][78]
处理过程: [5][17][26][33][28][27][53][49][87][78]
处理过程: [5][17][26][27][28][33][53][49][87][78]
处理过程: [5][17][26][27][28][33][53][49][87][78]
处理过程: [5][17][26][27][28][33][49][53][87][78]
排序结果:
5 17 26 27 28 33 49 53 78 87

 

posted @ 2016-03-02 10:13  zerocoin  阅读(222)  评论(0编辑  收藏  举报