排序思路
将队列分为有序区和无序区两部分,每次从无序区选第一个元素插入到前面的有序区中的正确位置。
插入前需要移动有序区元素。
排序实现
代码:
//插入排序算法
public static int[] sort(int[] a) {
//默认第一位为有序序列,从第二位开始判断
for (int i = 1; i < a.length; i++) {
//拿到需要排序的值
int x = a[i];
//与已排序的序列依次比较
for (int n = i - 1; n >= 0; n--) {
//如果待排序的值比已排序的值小,把已排序的值向后移,为待排序值留下空间插入
if (x < a[n]) {
a[n + 1] = a[n];
//如果待排序值比a[0]还小,将a[0]的值后移之后,将待排序值放在a[0]位置
if (n == 0) {
a[0] = x;
}
} else {
//如果待排序值不比已排序值小,那么待排序值应该放在已排序值的后面
a[n + 1] = x;
break;
}
}
}
return a;
}
步骤:
- 默认第一位为有序序列,从第二位开始判断;
- 拿到需要排序的值;
- 与已排序的序列依次比较;
- 如果待排序的值比已排序的值小,把已排序的值向后移,为待排序值留下插入空间;
- 如果待排序值比a[0]还小,将a[0]的值后移之后,将待排序值放在a[0]位置;
- 如果待排序值大于或等于已排序值,那么待排序值应该放在已排序值的后面。
改进
参考一位大神的算法,发现实现的特别巧妙:
public static void sort2(int[] a) {
for (int i = 1; i < a.length; i++) {
//获取待排序元素
int inserted = a[i];
int j;
//将已排序队列中大于待排序元素的数值全部后移,同时定位到小于等于待排元素的数组下标
for (j = i - 1; j >= 0 && inserted < a[j]; j -= 1) {
a[j + 1] = a[j];
}
//将待排元素插入到前面定位的下标之后(对于待排序元素全都大于待排序元素的情况也一样适用)
a[j + 1] = inserted;
}
}
优先推荐大神的算法,思路清晰。