上动图:
插入排序:
public static <E extends Comparable<E>> void sort(E[] data){
for (int i=1;i<data.length;i++){
for (int j=i-1;j>=0;j--){
if (data[j].compareTo(data[j+1])>0){
swap(data,j,j+1);
}else {
break;
}
}
}
}
//优化
public static <E extends Comparable<E>> void sort2(E[] data){
for (int i=1;i<data.length;i++){
for (int j=i-1;j>=0&&data[j].compareTo(data[j+1])>0;j--){
swap(data,j,j+1);
}
}
}
//优化2
public static <E extends Comparable<E>> void sort3(E[] data){
for (int i=1;i<data.length;i++){
E midValue=data[i];
int j;
for (j=i-1;j>=0&&midValue.compareTo(data[j])<0;j--){
// if (){
data[j+1]=data[j];
// }else {
// break;
// }
}
data[j+1]=midValue;
}
}
/* //换个角度实现 //data[0,i)未排序;data[i...n)已排好序
public static <E extends Comparable<E>> void sort4(E[] data){
for (int i=0;i<data.length-1;i++){//不断从第一个元素开始到最后一个元素
//data[0,i)未排序;data[i...n)已排好序
for (int j=data.length-1;j>i;j--){//从i不断往前判断
if (data[j].compareTo(data[j-1])>0){//前一个(左)大于后一个(右),交换
swap(data,j,j+1);//小的在前面(左)
}else{//前面已排好序就不用往后判断
break;
}
}
}
}*/
//换个角度 实现插入排序 data[0,i)未排序;data[i...n)已排好序
public static <E extends Comparable<E>> void sort4(E[] data){
for (int i=data.length-1;i>=0;i--){//不断从第一个元素开始到最后一个元素
E midValue=data[i];//存最小
//data[0,i)未排序;data[i...n)已排好序
int j;
for (j=i;j<data.length-1&&midValue.compareTo(data[j+1])>0;j++){//从i不断往前判断
//前一个(左)大于后一个(右),交换
data[j]=data[j+1];
}
data[j]=midValue;
}
}
private static <E> void swap(E[] data,int j,int k){
E temp;
temp=data[j];
data[j]=data[k];
data[k]=temp;
}
public static void main(String[] args){
Integer[] data={16,8,30,90,2,4,0,1};
sort(data);
for (int i=0;i<data.length;i++){
System.out.print(" "+data[i]);
}
System.out.println();
}