插入排序(Insertion Sort)及其优化 —— C++

时间复杂度:O(n^2)
在数组近乎有序的条件下的时间复杂度:近乎等于O(n)
要求:数组从小到大排序
原理:从左到右遍历整个数组,挨个将未排序元素从右到左与左边已经排好序的元素进行比较,直到找到第一个不大于它的元素时,将其插入作为该元素的后继;若遍历结束也找不到,其便是新的最小值,插入作为首元素。
在这里插入图片描述
简易版(比较,交换):

template<typename T>
void insertionSort(T arr[], int n){
    // 寻找元素arr[i]合适的插入位置
    for( int i = 1 ; i < n ; i ++ ) {
        for( int j = i ; j > 0 ; j-- )
            if( arr[j] < arr[j-1] )
                swap( arr[j] , arr[j-1] );
            else
                break;
    return;
}

                            
template<typename T>
void InsertionSort(T arr[], int n){
    // 寻找元素arr[i]合适的插入位置
    for( int i = 1 ; i < n ; i ++ ) {
        for( int j = i ; j > 0 && arr[j] < arr[j-1] ; j -- )
            swap( arr[j] , arr[j-1] );
    }
    return;
}

优化方法:直接交换—>先赋值,最后进行交换
可优化原因:不再频繁使用交换函数,赋值比交换函数运行速度更快
在数组本身基本有序的条件下,插入排序效率非常高的原因:可以提前终止内层循环

template<typename T>
void insertionSort(T arr[], int n){
    for( int i = 1 ; i < n ; i ++ ) {
        T e = arr[i];
        int j; 
        for (j = i; j > 0 && arr[j-1] > e; j--)
            arr[j] = arr[j-1];
        arr[j] = e;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值