shell排序

任务描述
本关任务:实现shell排序算法,void ShellSort(int R[],int N,int d[],int t)。

相关知识
基本思想:对待排记录序列先作“宏观”调整,再作“微观”调整,它是由Donald.L.Shell在1959年提出来的。

所谓“宏观”调整,指的是,“跳跃式”的插入排序。    即:将记录序列分成若干子序列,每个子序列分别进行插入排序。关键是,这种子序列不是由相邻的记录构成的。

Donald.L.Shell设计的排序算法,特点:
    (1)  缩小增量
    (2)  多遍插入排序

例如,选用增量序列(4, 2,1)3个增量,进行3遍插入排序

案例:

#include <iostream>
#include <stdio.h>
using namespace std;
#define Max 500    /*N为数据量大小*/

void ShellSort(int R[], int N, int d[], int t);
void Print(int R[], int N);

int main()
{
    int *R, N, i, *d, t;
    cin >> N;
    R = new int[N + 1];
    for (i = 1; i <= N; i++)
        cin >> R[i];
    Print(R, N);
    cin >> t;
    d = new int[t];
    for (i = 0; i < t; i++)
        cin >> d[i];
    ShellSort(R, N, d, t);
    Print(R, N);
    return 0;
}

void Print(int R[], int N)
{
    int i;
    cout << R[1];
    for (i = 2; i <= N; i++)
        cout << "," << R[i];
    cout << endl;
}

void ShellSort(int R[], int N, int d[], int t)
{
    for (int k = 0; k < t; k++) { // 对于每个增量
        int dk = d[k];
        for (int i = dk + 1; i <= N; i++) { // 将R[i]插入到所在分组的有序序列中
            if (R[i] < R[i - dk]) {
                int j = i - dk;
                int temp = R[i];
                while (j > 0 && temp < R[j]) { // 移动元素
                    R[j + dk] = R[j];
                    j -= dk;
                }
                R[j + dk] = temp; // 插入元素
            }
        }
        Print(R, N); // 输出中间状态
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狗碎碎念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值