插入排序

废话不多说先上代码

void insertionSort(int arr[], int length) {
    int value;
    int x;

    for (int i = 1; i < length; ++i)
    {
        value = arr[i];
        x = i;

        for (; x > 0; --x)
        {
            if(arr[x - 1] > value) {
                arr[x] = arr[x - 1];
            } else {
                break;
            }
        }

        arr[x] = value;
    }

    return;
}

时间复杂度

O(n²)

空间复杂度

O(1) 原地排序

稳定排序

是稳定排序

算法核心思想

将待排序数组划分为两个区间,有序区间和无序区间。
有序区间在前,无序区间在后。
每次在无序区间的头部取出一个元素,插入到有序区间中某一个位置,使其依然有序。
最开始有序区间只有一个元素,随着轮次的增加,有序区间元素越来越多,无序区间元素越来越少,直至无序区间没有元素,共需进行 length - 1次。
随着有序区间的数越来越多,将元素插入到有序区间要进行的比较次数s就越来越多。
最初有序区间只有一个数据,需要比较一次,插入成功后有序区间有两个数据就要比较两次,有序区间有多少个元素就需要比较多少次。

一步一步实现插入排序

内层循环,将元素插入到有序区间中。

void insertionSort(int arr[], int length) {
    //要插入到有序区间的元素。
    int value;
    //arr[1]为无序区间中的第一个元素
    value = arr[1];
    //有序区间的最后一个元素
    //这里 i 不能在for里面定义,后面还要用
    int i = 0;
    //从有序区间的最后开始寻找value应该插入的位置
    for(; i >= 0; --i) {
        if(arr[i] > value) {
            //这里的 i + 1其实就是value原来的位置,value已经被保存了,直接覆盖就可以
            arr[i + 1] = arr[i];
        } else {
            //当前元素不大于value,当前元素的下一个元素就应该是value,注意 break 后 i 不会 --,break 后 --i 不执行。
            break;
        }
    }
    arr[i + 1] = value;
}

外层循环,不断从无序区间取出数据插入到有序区间

void insertionSort(int arr[], int length) {
    //要插入到有序区间的元素。
    int value;
    for(int x = 1; x < length; ++x) {
        //arr[x]为无序区间中的第一个元素
        value = arr[x];
        //有序区间的最后一个元素
        int i = x - 1;
        //从有序区间的最后开始寻找value应该插入的位置
        for(; i >= 0; --i) {
            if(arr[i] > value) {
                //这里的 i + 1其实就是value原来的位置,value已经被保存了,直接覆盖就可以
                arr[i + 1] = arr[i];
            } else {
                //当前元素不大于value,当前元素的下一个元素就应该是value,注意 break 后 i 不会 --,break 后 --i 不执行。
                break;
            }
        }
        arr[i + 1] = value;
    }
}
//加上外循环后就完成了

插入排序已经完成了

插入排序和冒泡排序进行比较的次数是一样的,但插入排序更受欢迎,因为插入排序赋值操作要少于冒泡排序。

//冒泡
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
//插入
arr[i + 1] = arr[i];

都看到这了,点个赞再走嘛~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容