现实中打牌
接收到新牌后在已有的牌里面进行排序,然后找到属于自己的位置进行插入:
- 手中的牌永远是有序的
Code
package kb.algorithm;
public class InsertionSort {
public static void main(String[] args) {
int[] a = new int[]{3, 6, 4, 7, 2};
sort(a);
StringBuilder sb = new StringBuilder(20);
for (int i = 0; i < a.length; i++) {
sb.append(a[i]);
sb.append(",");
}
System.out.println(sb);
}
public static void sort(int[] a) {
for (int i = 1; i < a.length; i++) {
int currentValue = a[i];//相当于最新接到一张牌
int j = i - 1;// j=i-1; 相当于从之前的所有牌里面进行比较,一直到满足的槽位
for (; j >= 0; j--) {
if (a[j] > currentValue) {
a[j + 1] = a[j];
} else {
break;
}
}
a[j + 1] = currentValue;//执行插入。j已经是下一个位置了,j+1就是满足条件的槽位。
}
}
}
执行结果
2,3,4,6,7,
分析演示
i循环控制接收新牌,j循环控制给新收到的牌找到一个合适的位置并进行查询。
- 属于稳定排序,大小相同的数据原有的顺序不会变
- 最好O(n)。
- 最坏O(n^2)。
- 平均O(n^2)。