插入排序算法、时间复杂度和稳定性

插入排序

算法原理

  • 将数据分为有序部分和无序部分。
  • 在无序部分选择一个元素,按照顺序插入到有序部分,使之有序。
  • 直到无序部分都插入到有序部分结束。

算法分析

排序的思想就是维护一个有序的部分,将无序部分的数据按照顺序插入到有序部分。

通俗的讲,插入排序的原理就是:

先将最后一个元素作为有序部分,前面元素作为无序部分,将倒数第二个元素和最后一个元素比较,如果倒数第二个元素大于最后一个元素,则将倒数第二个元素查到最后一个元素的位置。

此时无序部分是第一个元素到倒数第三个元素,有序部分是最后两个元素。

再将倒数第三个元素按照顺序插入到最后两个元素中,使得最后三个元素成为有序部分。

重复上面的插入规则,直到无序部分为空为止。

代码实现

/**
 * @Title: insertSort
 * @Description: 插入排序
 * @param: array
 */
public static void insertSort(int[] array) {
    int n = array.length;
    for (int i = 0; i < n - 1; i++) {
        // 标记无序部分最后一个元素,作为待插入元素
        int k = n - 1 - i - 1;
        int j;
        // 遍历有序部分,将array[k]与有序部分元素进行比较
        for (j = k + 1; j < n; j++) {
            // 找出待插入元素的位置 j-1
            if (array[k] <= array[j]) {
                break;
            }
        }
        // 将待插入元素插入到有序部分
        if (k != j - 1) {
            insertItem(array, k, j - 1);
        }
    }
}

/**
 * @Title: insertItem
 * @Description: 把数组array下标为i的元素插入到下标为j的位置
 * @param: array
 * @param: i
 * @param: j
 */
private static void insertItem(int[] array, int i, int j) {
    int temp = array[i];
    for (int k = i + 1; k <= j; k++) {
        array[k - 1] = array[k];
    }
    array[j] = temp;
}

时间复杂度和算法稳定性

从代码中可以看出一共遍历了n-1 + n-2 + … + 2 + 1 = n * (n-1) / 2 = 0.5 * n ^ 2 - 0.5 * n,那么时间复杂度是O(N^2)。

因为在有序部分元素和待插入元素相等的时候,可以将待插入的元素放在前面,所以插入排序是稳定的。

相关代码都在github上:https://github.com/LebronChenX/sort

喜欢这篇文章的朋友,欢迎长按下图关注公众号lebronchen,第一时间收到更新内容。
扫码关注

猜你喜欢

转载自blog.csdn.net/Leon_cx/article/details/81487441
今日推荐