文章

2

粉丝

0

获赞

6

访问

221

头像
排序2 题解:
P1106
发布于2026年2月7日 09:43
阅读数 144

这道题目要求分别实现直接插入排序、希尔排序(d=5)、直接选择排序、快速排序和二路归并排序算法,但实际上可以通过巧用sort和stable_sort达到一样的效果。

直接插入排序是稳定的,所以直接套用stable_sort即可。

希尔排序(d=5)讲究分组的个数为步数,也就是1234512345的分配,是可以通过遍历来分组的。我们可以使用一个大小为d=5的向量数组分别存储希尔排序中的d=5个组,(而且d可以作为常量定义在程序中,方便作为第一趟希尔排序的模板使用)这样就可以1234512345地把原数组中的元素push back到各组向量中了。之后把每个组分别sort排序。输出也需要用到team变量,按照组号12345(下标01234)这样的输出。

直接选择排序和快排都是不稳定排序,sort完之后返回结果即可。

第一趟二路归并排序并不好想,因为常见的二路归并是递归实现的,在递归树中剪枝也是高级技巧,至少我自己是不知道的。但是可以根据第i趟归并排序有组元素这个性质,知道第一趟归并排序其实只要保持相邻元素局部有序就行了。这个操作其实使用for循环和sort函数就能做到,只需要设置for循环和sort的参数来划分范围,让数组在局部保持有序即可。

一言以蔽之,这道题本来是要考察某些排序算法的代码的,但是只要我们了解排序算法的性质,就可以想办法巧用sort和stable_sort函数模拟,甚至顶替排序函数的。

#include<bits/stdc++.h>
using namespace std;

const int d=5; // 希尔排序的步数

int main(){
    // 接收待排序的元素n和要排序的元素
    int n;
    cin >> n;
    int elems[105]={0};
    for (int i=0;i<n;i++){
        cin >> elems[i];
    }
    // 直接插入排序用stable_sort
    int elems_i[105]={0};
    // 复制数组
    for (int i=0;i<n;i++){
        elems_i[i]=e...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发