插入排序思想:设数组的长度为N(4,3,1,5,2)
1.从第一个数开始往后看,遇到比前一个数的情况就可以向前插入
2.查看刚刚插入的数是否比现阶段前面的数小,如小则继续向前插入
3.例如:4前面无数,不动;3<4,3插入4前面,3前面无数,不动;1<4,1差在4的前面,1继续和3比较,1<3,1插在3的前面,1前无数,不动...
小结:平均时间复杂度O(n^2);最好情况O(n);最坏情况O(n^2);空间复杂度O(1);占用内存,不占用额外内存;稳定性:稳定
//通常解法
public static void insert_normal(int[] arra) {
for (int i = 1; i < arra.length; i++) {
for (int j = i - 1; j >= 0 && arra[j] > arra[j + 1]; j--) {
int temp = arra[j];
arra[j] = arra[j + 1];
arra[j + 1] = temp;
}
}
for (int aa : arra) {
System.out.println(aa);
}
}
//相对最优解法
public static void insert_fashion(int[] arra) {
for (int i = 1; i < arra.length; i++) {
for (int j = i - 1; j >= 0 && arra[j] > arra[j + 1]; j--) {
swap(arra, j, j + 1);
}
}
}
public static void swap(int[] arra, int i, int j) {
arra[i] = arra[i] ^ arra[j];
arra[j] = arra[i] ^ arra[j];
arra[i] = arra[i] ^ arra[j];
}
//测试用例
public static void main(String[] args) {
int[] arra = {5, 7, 9, 3, 2, 6, 4, 1, 0, 8};
insert_normal(arra);
insert_fashion(arra);
}
1.从第一个数开始往后看,遇到比前一个数的情况就可以向前插入
2.查看刚刚插入的数是否比现阶段前面的数小,如小则继续向前插入
3.例如:4前面无数,不动;3<4,3插入4前面,3前面无数,不动;1<4,1差在4的前面,1继续和3比较,1<3,1插在3的前面,1前无数,不动...
小结:平均时间复杂度O(n^2);最好情况O(n);最坏情况O(n^2);空间复杂度O(1);占用内存,不占用额外内存;稳定性:稳定
//通常解法
public static void insert_normal(int[] arra) {
for (int i = 1; i < arra.length; i++) {
for (int j = i - 1; j >= 0 && arra[j] > arra[j + 1]; j--) {
int temp = arra[j];
arra[j] = arra[j + 1];
arra[j + 1] = temp;
}
}
for (int aa : arra) {
System.out.println(aa);
}
}
//相对最优解法
public static void insert_fashion(int[] arra) {
for (int i = 1; i < arra.length; i++) {
for (int j = i - 1; j >= 0 && arra[j] > arra[j + 1]; j--) {
swap(arra, j, j + 1);
}
}
}
public static void swap(int[] arra, int i, int j) {
arra[i] = arra[i] ^ arra[j];
arra[j] = arra[i] ^ arra[j];
arra[i] = arra[i] ^ arra[j];
}
//测试用例
public static void main(String[] args) {
int[] arra = {5, 7, 9, 3, 2, 6, 4, 1, 0, 8};
insert_normal(arra);
insert_fashion(arra);
}