import java.util.Arrays;
public class Insertion {
public static void main(String[] args) {
int [] array = {1, 0, 88, 25, 3, 10, 2, 95, 66, 888, 23, 5};
System.out.println("原:" + Arrays.toString(array));
sort(array);
System.out.println("升序:" + Arrays.toString(array));
desc(array);
System.out.println("降序:" + Arrays.toString(array));
asc(array);
System.out.println("升序:" + Arrays.toString(array));
}
/**
* 排序, 含个人说明
*
* 个人说明仅做参考
*
* */
private static void sort(int [] array){
int length = array.length;
for (int i = 1; i < length; i++) {
/*
* 1. 内层循环要从 i的前一位开始判断 , 这是为了判断第一位的值是否需要和第二位置换.
*
* 所以这是为什么 i 要从1 开始, j 要从 i - 1开始(一开始是0)
*
* 2. j 放在第一层声明, 是为了将 当前值已经得出的最佳位置 进行插入的操作.
*
* 当内层循环的条件成立时, 排序块会为当前值进行腾位. 而没必要每次都在判断成立后直接更改值, 因为还不确定是否还有符合的值.
* 当然, 在 if(array[j] > v){
* array[j + 1] = array[j];
* array[j] = v;
* 这样写, 也是可以的.
* */
int v = array[i];
int j = i - 1;
for (; j >= 0 ; j--) {
/*
* 当 当前排序的值 小于 当前已经排序好的值时(排序块)时,
*
* 需要将排序块中的当前比较的位置后移, 给当前值腾出地.
*
* 如果 当前排序的值 小于 排序块里的值时,
*
* 说明当前排序的值, 已经无法往前移位了, 这是属于它当前的位置
* */
if(array[j] > v){
array[j + 1] = array[j];
}else{
break;
}
}
array[j + 1] = v;
}
}
public static void desc(int [] array){
int length = array.length;
for (int i = 1; i < length; i++) {
int v = array[i];
int j = i - 1;
for (; j >= 0 ; j--) {
if(array[j] < v){
array[j + 1] = array[j];
}else{
break;
}
}
array[j + 1] = v;
}
}
public static void asc(int [] array){
int length = array.length;
for (int i = 1; i < length; i++) {
int v = array[i];
int j = i - 1;
for (; j >= 0; j--) {
if(array[j] > v){
array[j + 1] = array[j];
}else {
break;
}
}
array[j + 1] = v;
}
}
}