C++ 实现直接插入排序

直接插入排序

引言

直接插入排序在生活中最好的体现就是玩扑克牌,我们理牌的方式是把3和4移动到5的左侧,再拿到一张2,把2移到最左侧,拿到一张10,放最后边,再拿到一张7,插入5与10中间。这里我们的理牌方法就是直接插入排序。

话不多说,直接上代码,这里一步步给出不同的写法:

写法1

#include <iostream>
#include <algorithm>
using namespace std;

// 直接插入排序
template <typename T>
void insertSort(T arr[], int n){

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

    }
}

解释一下,第一层循环,遍历数组元素,第二层拿到一个元素arr[j],和前面的元素逐个比较(类比,前面拿到了3,5牌,现在拿到了2,先与5比较),2<5, OK,交换2和5,把2插入到3与5之间,然后2与3比较,2<3, ok,2与3交换,此时2已经到了最左端,这是退出二层循环,拿下一张牌。

写法2

#include <iostream>
#include <algorithm>
using namespace std;
template <typename T>
void insertSort(T arr[], int n){

    for(int i = 1; i < n; i++){
        // 寻找元素arr[i]合适的插入位置
        // 写法2
        for(int j = i; j > 0 && arr[j] < arr[j-1] ; j--){
            swap(arr[j], arr[j-1]);
        }

    }
}

这种写法和写法1道理上是一样的,只是更加简洁了。

写法3

#include <iostream>
#include <algorithm>
using namespace std;
template <typename T>
void insertSort(T arr[], int n){
    // 注意起始顺序
    for(int i = 1; i < n; i++){
        // 寻找元素arr[i]合适的插入位置

        // 写法3
        // 设置一个临时变量将待插入的值保存下来,然后开始右移元素
        T e = arr[i];
        int j;
        for(j = i; j > 0 && arr[j-1] > e; j--){
            //如果满足j>0 而且arr[j-1]>e, 记录右移
            arr[j] = arr[j-1];
        }
        arr[j] = e;
    }
}

写法1和写法2使用了swap函数,每次swap函数都会进行三次赋值操作,这会增加一定的开销,这里我们对算法进行一些优化,再回到我们抓牌时理牌的场景,我们现在手上有3和5,又抓到了一张2,我们并不是先把2插到3与5之间,再抽出来插入到3前面,而是让2先与5比较,2比5小,不急着换位置,再看2与3大小,2<3,此时左边没有比2小的,再把2插进去。我们的写法3就是类似这种直观操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值