import java.util.ArrayList;
import java.util.List;


public class sortMethods {
    
    
    //插入排序:每次拿出第i个元素,并将其与之前已经排好序的数组进行比较,找到插入的位置,对于已经排好序的数组来说,算法复杂度为o(n),对于倒序的数组来说,算法复杂度为o(n^2);
    //单纯的线性查找,而是还要移出一个空位让A[i]插入,因此就算二分查找用O(lgn)查到了插入的位置,但是还是要用O(n)的时间移出一个空位。
    public double[]InsertSort(double []datas){
        for(int i = 1;i<datas.length;i++){
            double key = datas[i];
            int j = i-1;
            while(j>0&&datas[j]>key){
                    datas[j+1]=datas[j];
                    j--;  
            }
            datas[j+1]=key;
        }
        return datas;
    }
    
    
    
    //快速排序O(nlog2n)
    //1、选取一个基准元素,通常为第一个元素,将数组datas分为三部分,第一部分为比key小的元素listmin,第二部分为key,第三部分为比key大的元素listmax,分别对listmin和listmax重复上述过程。
    public List<Double>  fastSort(List<Double> datas){
        double key = datas.get(0);
//        System.out.println(key);
        List<Double> listmin = new ArrayList<Double> ();
        List<Double>  listmax = new ArrayList<Double> ();
        for(int i = 1;i<datas.size();i++){
            if(datas.get(i)<=key){
                listmin.add(datas.get(i));
            }else{
                listmax.add(datas.get(i));
            }
        }
        if(listmin.size()>1){
            listmin=fastSort(listmin);
        }
        if(listmax.size()>1){
            listmax=fastSort(listmax);
        }
        List<Double>  sum = new ArrayList<Double> ();
        sum.addAll(listmin);
        sum.add(key);
        sum.addAll(listmax);
        return sum;
    }
    
    
    //冒泡排序O(n^2)
    //通过两两交换,像水中的泡泡一样,小的先冒出来,大的后冒出来。
    public List<Double>BubbleSort(List<Double> datas){
        int length = datas.size();
        for(int i = 0;i<length;i++){
            
            //每一次内循环之后,最小的放在了第i个位置
            for(int j = length-1;j>i;j--){
                if(datas.get(j)<datas.get(j-1)){
                    double temp = datas.get(j);
                    datas.set(j, datas.get(j-1));
                    datas.set(j-1, temp);
                }
            }
        }
        return datas;
    }
    
    
    //插入排序和冒泡排序的区别
    //渐进时间都是o(n^2);但是插入排序的速度是逆序对的个数,而冒泡排序中执行“交换“的次数是逆序对的个数,因此冒泡排序执行的时间至少是逆序对的个数,因此插入排序的执行时间至少比冒泡排序快。
    
    
    
    //选择排序:每次找一个最小值。o(n^2)
    public List<Double>SelectSort(List<Double> datas){
        for(int i = 0;i<datas.size()-1;i++){
            int min = i;
            for(int j = i+1;j<datas.size();j++){
                if(datas.get(min)>datas.get(j)){
                    min = j;
                }
            }
            double temp  = datas.get(i);
            datas.set(i, datas.get(min));
            datas.set(min, temp);
        }
        return datas;
    }
    
    
    
    
    
    //计数排序
    
}

 

posted on 2016-12-06 20:00  薄樱  阅读(180)  评论(0编辑  收藏  举报