关于选择排序和插入排序的分析

我们先介绍一下选择排序和插入排序
选择排序 : 
是每次从索引i开始遍历数组找到最小的数放在第i个位置
每次我们先默认i是最小数的索引,我们从i后面开始比较,如果找到比a[i]更小的a[j] 我们把min=j
然后我们交换a[i],a[min] 这样我们就可以保证第i个位置的值是从i开始到后面中最小的
假设数组长度为n 我们进行了(n^2 -n)/2次 约为n^2/2 我们交换了n次
插入排序(这个插入排序是算法第4版上的,感觉和我之前见到的插入排序有点不同,但是本质上差不多) :
因为第一个元素默认是有序的,我们从第二个元素开始,依次从第i个元素开始,将其与前面的元素进行比较 如果a[j]<a[j-1]我们就交换它们的位置然后j-- ...直到i插入到合适的地方结束 因为我们在for循环中加入了判断理论上我们的判断次数只是选择排序的一半 但是在最坏的情况下(for循环中加入的判断没有用上,即倒序时)我们也要进行和选择排序一样的比较次数,这时我们的交换次数也是这么多(同比较次数)最好的情况下(完全有序)我们只需要比较n-1次,交换0次
如果觉得不够透彻结合代码看看。
public class Selection {
    public static void main(String [] agrs){
        Double [] ary1 = new Double [10];
        Double [] ary2 = new Double[10];
        for(int i=0;i<10;i++){
            ary1[i] = (Math.random() * 15);
            ary2[i] = (Math.random() * 15);
        }
        show(ary1);
        show(ary2);
        System.out.println("after being sorted");
        Selection(ary1);
        Insertion(ary2);
        show(ary1);
        show(ary2);



    }
    public static boolean less(Comparable a,Comparable b){   //比较函数 a<b时 返回True
        return a.compareTo(b) < 0;
    }
    public static void exch(Comparable [] a,int i,int j){    //交换
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    public static void show(Comparable [] a){
        for(int i=0;i<a.length;i++)
            System.out.printf("%f ",a[i]);
        System.out.println();
    }
    public static void Selection(Comparable [] a){             //选择排序
        for(int i=0;i<a.length;i++){
            int min = i;
            for(int j=i+1;j<a.length;j++){                    
                if(less(a[j],a[min])) min=j;
            }
            exch(a,i,min);
        }

    }
    public static void Insertion(Comparable [] a){            //插入排序
        for(int i=1;i<a.length;i++){
            for(int j=i;j>0&&less(a[j],a[j-1]);j--)
                exch(a,j,j-1);
        }

    }

}

猜你喜欢

转载自blog.csdn.net/qq_37663299/article/details/81367213