package com.test;
public class InsertSort {
public static void main(String[] args) {
int numbers[] = { 3, 7, 5, 1, 67, 9, 2, 34, 12, 45 };
//从方法1到方法3代码逐渐优化
insertSort1(numbers);
insertSort2(numbers);
insertSort3(numbers);
}
// =====插入排序=====
// 每次循环就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列中。
//
// 3 7 5 1 67 9 2 34 12 45 第1次循环后(i=1,此时7>3,不做任何改变)
// (开始第2次循环,i=2,此时5<7,把7向后移,把5放到7的位置)
// 3 5 7 1 67 9 2 34 12 45 第2次循环后
// (开始第3次循环,i=3,此时1<7,1<5,1<3,,把7,5,3向后移动,把1放到3,5,7前面)
// 1 3 5 7 67 9 2 34 12 45 第3次循环后
// 1 3 5 7 67 9 2 34 12 45 第4次循环后
// 1 3 5 7 9 67 2 34 12 45 第5次循环后
// 1 2 3 5 7 9 67 34 12 45 第6次循环后
// 1 2 3 5 7 9 34 67 12 45 第7次循环后
// 1 2 3 5 7 9 12 34 67 45 第8次循环后
// 1 2 3 5 7 9 12 34 45 67 第9次循环后
private static void insertSort1(int[] numbers) {
int size = numbers.length;
for (int i = 1; i < size; i++) {
int temp = numbers[i]; // 用一个临时变量temp存放当前位置的值
int index = i; // 用index记录 所要插入位置的坐标
for (int j = i; j > 0; j--) {
// 如果temp小于它前面的一个数,将temp前面的数向右移动一位,直到找到合适的位置
if (temp < numbers[j - 1]) {
numbers[j] = numbers[j - 1];
index = j - 1; // index记录 所要插入位置的坐标
} else {
break;
}
}
numbers[index] = temp; // 将temp放到所要插入的位置
}
}
private static void insertSort2(int[] numbers) {
int size = numbers.length;
for (int i = 1; i < size; i++) {
int temp = numbers[i]; // 用一个临时变量temp存放当前位置的值
int index = i; // 用index记录 所要插入位置的坐标
for (int j = i; j > 0 && temp < numbers[j - 1]; j--) {
numbers[j] = numbers[j - 1];
index = j - 1; // index记录 所要插入位置的坐标
}
numbers[index] = temp; // 将temp放到所要插入的位置
}
}
private static void insertSort3(int[] numbers) {
int size = numbers.length;
for (int i = 1; i < size; i++) {
int temp = numbers[i]; // 用一个临时变量temp存放当前位置的值
int j; // 用j记录 所要插入位置的坐标
for (j = i; j > 0 && temp < numbers[j - 1]; j--) {
numbers[j] = numbers[j - 1];
}
numbers[j] = temp; // 将temp放到所要插入的位置
}
}
}