排序算法 - (直接)插入排序 (Insertion Sort)

排序算法 - (直接)插入排序 (Insertion Sort)

July 2, 2018

基本思路

假设按照从小到大排列,总共有n个元素。

  • 整个数组从逻辑上会被分成两个部分,左边部分是有序的序列,右边部分是待排序的元素。当然,刚开始左边的有序序列仅有一个元素,即第一个元素
  • 将右边待排序元素的第一个元素,与左边有序序列进行比较。比较的时候,是从有序序列的末端(即有序序列最大的一个数)开始进行比较,如果比它大或者与之相等则直接插在其后面,否则一直往前面找,直到找到该插入的位置。插入的时候,需要把所插入位置右边的所有元素往右移。
  • 重复上面的步骤,直到所有待排序的元素处理完毕

插入排序图例

性能

平均需要n2/4次比较, n2/4次交换;最差情况n2次比较,n2次交换;最好情况n-1次比较,0次交换

时间复杂度:平均O(n2),最坏O(n2),最好O(n)

空间复杂度: O(1)

示例代码

更多详情可点击链接参考示例代码

private static int[] insertionSort(int[] unsortedArray) {
    int insertIndex;
    for (int splitter = 1; splitter < unsortedArray.length; splitter ++) {
        // Should have N - 1 rounds

        // Get the insert index
        insertIndex = splitter;
        for (int j = splitter -1; j >= 0; j --) {
            if (unsortedArray[j] > unsortedArray[splitter]) {
                insertIndex = j;
                continue;
            } else {
                break;
            }
        }

        // Move the item to right
        int temp = unsortedArray[splitter];
        for (int mov = splitter; mov > insertIndex; mov --) {
            unsortedArray[mov] = unsortedArray[mov - 1];
        }
        unsortedArray[insertIndex] = temp;
    }

    return unsortedArray;
}

用测试用例,有如下的输出。

Before sort: 3, 2, 9, 6, 0, 4, 8, 5, 7, 1
After round 1: 2, 3, 9, 6, 0, 4, 8, 5, 7, 1
After round 2: 2, 3, 9, 6, 0, 4, 8, 5, 7, 1
After round 3: 2, 3, 6, 9, 0, 4, 8, 5, 7, 1
After round 4: 0, 2, 3, 6, 9, 4, 8, 5, 7, 1
After round 5: 0, 2, 3, 4, 6, 9, 8, 5, 7, 1
After round 6: 0, 2, 3, 4, 6, 8, 9, 5, 7, 1
After round 7: 0, 2, 3, 4, 5, 6, 8, 9, 7, 1
After round 8: 0, 2, 3, 4, 5, 6, 7, 8, 9, 1
After round 9: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
After sort: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

最后更新于