直接插入排序

直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

核心代码(C实现)

void InsertSort(int arr[], int len)
{
    //无序数组的下标
    int i;
    //有序数组的下标
    int j;
    //保存无序数组第一个元素的值
    int temp;

    //检测参数
    assert(arr!=NULL && len<=0);
    
    for(i=0; i<len; ++i)
    {
        temp = arr[i];
        j = i-1;
        while(temp<arr[j] && j>=0)
        {
            //把大的元素放到后面
            arr[j+1] = arr[j];
            --j;
        }

        //把无序数组的第一个值放到正确的位置
        arr[j+1] = temp;
    }
}

核心代码(C++实现)

template <typename T>
void insertSort(T array[], int length)
{
    if ((NULL == array) || (length < 2)) {
        return;
    }

    for (int disorder_index = 0; disorder_index < length; ++disorder_index) // 遍历无序数据
    {
        int disorder_value = array[disorder_index]; // 保存无序数据的第一个值
        int order_index = disorder_index-1; // 记录有序数据的下标
        while ((order_index >= 0) && (disorder_value < array[order_index])) // 根据(order_index>=0)判断无序数据中的第一个值是否和所有的有序数据比较完成     
        {
            array[order_index+1] = array[order_index]; // (从小到大)当无序的值 < 有序的值,就将有序数据向后移动一个位置
            --order_index;
        }
        array[order_index+1] = disorder_value; // 将无序的值 插入 正确的位置
    }
}

算法分析:

  最好时间复杂度:O(n)

  平均时间复杂度:O(n^2)

  最坏时间复杂度:O(n^2)

    空间复杂度:O(1)

      稳定性:稳定

直接插入排序在性能上要比简单选择排序和冒泡排序好一些。

直接插入排序在记录比较少和记录本身是基本有序时,效率是比较高的。由于这两个条件,后面就产生了希尔排序。

原文地址:https://www.cnblogs.com/chen-cai/p/7679592.html