前言:算法讲究的是逻辑思维,然后再用代码去实现你的逻辑,因此,你的逻辑思维很重要。
int[] array = {22, 10, 15, 33, 54, 7, 66, 2};
插入排序的逻辑:
第一次遍历:插入数字10,首先拿下标0位置的数据和下标1位置的数据作比较,大的数据往后排;
第一次排序前:{22, 10, 15, 33, 54, 7, 66, 2};
第一次排序后:{10, 22, 15, 33, 54, 7, 66, 2}第二次遍历:插入数据15,拿15和22比较,15小于22,往前移,然后用15和10比较,15大于10,不移动;
第二次排序前:{10, 22, 15, 33, 54, 7, 66, 2}
第二次排序后:{10, 15, 22, 33, 54, 7, 66, 2}第三次遍历:插入数据33,拿33和前一个数据(22)比较,33比22大,不移动;
第三次排序前:{10, 15, 22, 33, 54, 7, 66, 2}
第三次排序后:{10, 15, 22, 33, 54, 7, 66, 2}....
第N次排序前:{7, 10, 15, 22, 33, 54, 66, 2}
第N次排序后:{2, 7, 10, 15, 22, 33, 54, 66}总结规律:插入排序是每插入一个数字,就跟前面的数字进行比较,如果比前面的数字小,则往前移,然后前移的数字继续和前面的数字作比较,如果小于前面的数字,继续前移,以此遍历,直到不小于前面的数字才停止。
话不多说,上代码:
public static void main(String[] args) {
int[] array = {22, 10, 15, 33, 54, 7, 66, 2};
insertSort(array);
printArray(array);
}
/**
* 插入排序
*
* @param array 需要排序的数组
*/
private static void insertSort(int[] array) {
if (array == null || array.length < 2) {
return;
}
int len = array.length;
for (int i = 1; i < len; i++) {
for (int end = i; end >= 1 && array[end] < array[end-1]; end--) {
int temp = array[end-1];
array[end-1] = array[end];
array[end] = temp;
}
}
}
/**
* 打印数组
*
* @param array 需要打印的数组
*/
private static void printArray(int[] array) {
for (int i : array) {
System.out.print(i + " ");
}
System.out.println();
}
运行结果: