思路: 从数组下标为1的地方开始,从前往后遍历,每遍历到一个元素,都将它与它前面的所有元素比较,若有比它大的,则交换位置。 所以当遍历到i时,i左边的元素肯定是有序的了,只需把a[i]一次一次插入即可

代码实现

  public static void main(String[] args) {
        int[] array = {2, 3, -1, 5, 3, 2, 1, 3, 5, 1, 4, 5, 7, 9, -2};
        for (int i = 1; i < array.length; i++) {
            for (int j = i; j > 0 && array[j] < array[j - 1]; j--) { //一直遍历,直到遍历到第一个比 array[j] 小的元素则不遍历了(因为array[j]左边的元素都是有序的了)
                //进行交换
                array[j] = array[j] ^ array[j - 1];
                array[j - 1] = array[j] ^ array[j - 1];
                array[j] = array[j] ^ array[j - 1];
            }
        }
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i] + " ");
        }
    }
复制代码

运行结果

优化

可以在内循环中将较大的元素向右移动而不总是交换两个元素(这样访问数组的次数就能减半) 改进后的代码

 public static void main(String[] args) {
        int[] array = {2, 3, -1, 5, 3, 2, 1, 3, 5, 1, 4, 5, 7, 9, -2};
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int j = i-1;
            for (; j >= 0 && temp < array[j]; j--) { //一直遍历,直到遍历到第一个比 array[j] 小的元素则不遍历了(因为array[j]左边的元素都是有序的了)
                array[j + 1] = array[j];
            }
            array[j+1] = temp; // temp值到达插入位置
        }
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
复制代码

运行结果