我们先介绍一下选择排序和插入排序 选择排序 : 是每次从索引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
今日推荐
周排行