任务描述
本关任务:实现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); // 输出中间状态}
}