/**
* 插入排序
* 思路:从下标1开始跟前面的数据进行从小到大排序,保证当前下标前面的数据,都是已经排好序的。
* 这样的话,下标后面的,需要排序的数据,只需要向前对比,并找到自己合适的位置;
* 向前查找过程中,若遇到比自己小的数j,则j以及j之前的数据就不需要进行对比了,肯定比自己小,
* 这样就省去了跟剩余数对比的逻辑,提高算法效率。
* 复杂度:若数组是一个从小到大已经排好序的数组,则只需要对比n此,复杂度为n
* 若数组数一个从大到小排好序的数组,则每个元素,都需要跟前面的每个进行排序,复杂度为n*log以2为底n
*/
@Test
public void insertionSortTest() {
int[] array = getIntArray();
int len = array.length;
// 0自身就一个数,必然已经排好序,所以这里从1开始,跟前面的排好序的数组进行对比;
int start = 1;
while (start < len) {
/**
* 定义一个临时变量,用于记录对比的下标位置,因为start跟i对比后,可能还需要跟i-1,i-2位置对比
*/
int i = start - 1;
while (i >= 0 && array[start] < array[i]) {
i--;
}
// i++就是start应该处于的合适的位置.
i++;
/**
* while退出的条件:start是较小的一个数,可以在前面的列表中找到自己的位置;
* 或者 start就是最大数(i == start),while方法体没执行,就退出了。 *
*/
if (i < start) {
// 将start到i之间的数据都往前提一位,然后将start赋值到i的位置。
int temp = array[start];
for (int j = start; j > i; j--) {
array[j] = array[j - 1];
}
array[i] = temp;
}
// 开始确认下一个数的位置.
start++;
}
printArray(array);
}
private int[] getIntArray() {
int[] array = new int[10];
for (int i = 0; i < 10; i++) {
array[i] = (int) (Math.random() * 100);
printMsg("value" + i + ":" + array[i]);
}
return array;
}
private void printArray(int[] array) {
int len = array.length;
printMsg("print array start--");
for (int i = 0; i < len; i++) {
printMsg(array[i] + "");
}
printMsg("print array end--");
}
private void printMsg(String msg) {
System.out.println(msg);
}