22计算机408考研—数据结构—直接插入排序和二分插入排序

210 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

2022计算机考研408—数据结构—排序 手把手教学考研大纲范围内的排序 22考研大纲数据结构要求的是C/C++,笔者以前使用的都是Java,对于C++还很欠缺, 如有什么建议或者不足欢迎大佬评论区或者私信指出

Talk is cheap. Show me the code. 理论到处都有,代码加例题自己练习才能真的学会

直接插入排序

思路: 插入 == 把数插进去

也是两层循环

数组num

第一层循环从下标为1的值开始,循环变量为i

第二层循环就是把第一层的值拿出来,然后从第i-1个向前循环,找到第一个小于 num[i] 的值,

这个值的下标如果是j-1的话,那么 num[j] 就是第一个大于 num[i] 的值

num[i] 用一个变量 temp 保存一下

把下标为j到i-1的值依次向后移动一位,也就是说下标j到i-1的值移动到j+1到i

然后把 temp(原num[i])放到下标为j的地方(之前的num[j]已经移动到num[j+1]了),

按照这种排序,每次循环的都是i之前的,i之前的元素都是顺序存储的,

文字表述的不清楚的可以看每次循环i更改后数组的元素情况

#include <iostream>
#include <vector>

using namespace std;

void insertSort(vector<int> &num);
int main() {
    int n;    //n为将要输入的数组长度
    cin >> n;   //输入n   cin方法需要上面使用std
    vector<int> num;    //定义vector  记得上面导入vector
    int temp;   //temp为输入vector时的中间变量
    for (int i = 0; i < n; i++) {
        cin >> temp;            //输入
        num.push_back(temp);
    }
    insertSort(num);    //调用自定义的排序方法
    cout << "排序后" << "\n";
    for (int i = 0; i < num.size(); i++) {
        cout << num[i] << " ";     //输出
    }
    return 0;
}

void insertSort(vector<int> &num) {
    for (int i = 1; i < num.size(); i++) {
        int temp = num[i];      //保存一下num[i]
        int j;
        //从num[j]向前开始找,一直找到比temp(原num[i])小的数就结束
        //在循环过程中的数都比temp大的,不断地把temp大的数往后移动一位
        //由此可得,等找到num[j]<=temp的时候,循环已经结束了
        // 但是他的上一个,也就是num[j+1]的值已经移动到num[j+2]了
        for (j = i - 1; j >= 0 && num[j] > temp; j--) {
            num[j + 1] = num[j];
        }
        //可以直接把temp放到num[j+1],
        num[j + 1] = temp;
        //每次循环都可以把num[i]以及之前的数值排序好

        //每次循环都把数组的变动输出出来
        for(j = 0; j < num.size(); j++) {
            cout << num[j] << " ";
        }
        cout <<"\n";

    }
}

运行截图: 在这里插入图片描述

二分插入排序

思路: 二分插入和简单插入基本类似 不过是在寻找插入位置的时候不在采用简单插入的循环查找,而是使用二分查找 减少比较的次数,提升效率

#include <iostream>
#include <vector>

using namespace std;

void binInsertSort(vector<int> &num);
int main() {
    int n;    //n为将要输入的数组长度
    cin >> n;   //输入n   cin方法需要上面使用std
    vector<int> num;    //定义vector  记得上面导入vector
    int temp;   //temp为输入vector时的中间变量
    for (int i = 0; i < n; i++) {
        cin >> temp;            //输入
        num.push_back(temp);
    }
    binInsertSort(num);    //调用自定义的排序方法
    cout << "排序后" << "\n";
    for (int i = 0; i < num.size(); i++) {
        cout << num[i] << " ";     //输出
    }
    return 0;
}

void binInsertSort(vector<int> &num) {
    for (int i = 1; i < num.size(); i++) {
        int temp = num[i];          //保存临时变量
        int left = 0;               //使用二分法找到插入的位置left  使得num[left]<temp<num[left+1]
        int right = i - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (num[mid] > temp) {
                right = mid - 1;

            } else {
                left = mid + 1;
            }
        }
        for (int j = i - 1; j >= left; j--) {
            num[j + 1] = num[j];       //把left右面的值全部右移一位,
        }
        num[left] = temp;               //把temp放到num[left]的位置

        //每次循环都把数组的变动输出出来
        for (int j = 0; j < num.size(); j++) {
            cout << num[j] << " ";
        }
        cout << "\n";

    }
}


在这里插入图片描述