P1818_排序_插入排序1
然后是倒叙遍历。
第二趟排序的过程是?
2和4比较,2比4小,2、4交换。
2和3比较,2比3小,2、3交换。
第六趟排序的过程是?
5和12比,5比12小,5、12交换。
同理10。
5和4比,5比4大,5、4部交换。5找到正确位置。
P1919_排序_插入排序2
package cn.itcast.algorithm.sort;
public class Insertion {
/*
对数组a中的元素进行排序
*/
public static void sort(Comparable[] a){
//因为第一个(数组对应为0),算是已经排序的。
//待排序为第二个(数组对应为1,所以int i = 1)
for(int i=1;i<a.length;i++){
//for(int i=1;i<=a.length-1;i++){,只需要比较a.length-1次。因为第一个已经确定。
for(int j=i;j>0;j--){
//j=i?因为是从待排序的位置(就是i了),倒叙遍历。
//比较索引j处的值和索引j-1处的值,如果索引j-1处的值比索引j处的值大,则交换数据,如果不大,那么就找到合适的位置了,退出循环即可;
if (greater(a[j-1],a[j])){
exch(a,j-1,j);
}else{
break;
//这里为什么直接break了?
//因为前面(是已经排序了)比后面小,那就不用交换位置了。
}
}
}
}
/*
比较v元素是否大于w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
数组元素i和j交换位置
*/
private static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i]=a[j];
a[j]=temp;
}
}
package cn.itcast.algorithm.test;
import cn.itcast.algorithm.sort.Insertion;
import java.util.Arrays;
public class InsertionTest {
public static void main(String[] args) {
Integer[] a = {4,3,2,10,12,1,5,6};
Insertion.sort(a);
System.out.println(Arrays.toString(a));//{1,2,3,4,5,6,10,12}
}
}