是直接插入排序的改良版。
直接插入排序在记录本身有序和记录比较少时,比较高效。
希尔排序则用来创造这两个条件。
排序时采用跳跃分割的策略:将相距某个增量(increment)的记录组成一个子序列,保证在子序列内分别进行直接插入排序后的结果是基本有序而不是局部有序。
#include <iostream>
#include <cstdlib>
//顺序表结构
#define MAXSIZE 10 //要排序数组个数最大值
typedef struct
{
int r[MAXSIZE + 1]; //存储要排序数组,r[0]作为哨兵或临时变量
int length; //记录顺序表长度
}SqList;
//交换函数
void swap(SqList* L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
void ShellSort(SqList * L){
int i, j;
int increment = L->length;
do{
increment = increment / 3 + 1; //增量序列
for (i = increment + 1; i <= L->length; i++){
if (L->r[i] < L->r[i - increment]){
L -> r[0] = L->r[i];
for (j = i - increment; j>0 && L->r[0] < L->r[j]; j -= increment)
L->r[j + increment] = L->r[j];
L->r[j + increment] = L->r[0];
}
}
} while (increment > 1);
}
void main()
{
SqList data;
int len = 10; //待排序列个数
srand((int)time_t(NULL));
data.r[0] = { 0 };
std::cout << "排序前的数列为:";
for (int i = 1; i <= len; ++i)
{
data.r[i] = rand() % 10 + 1;
std::cout << data.r[i] << ' ';
}
data.length = len;
//Qsort(&data, 1, len);
ShellSort(&data); //快排算法
printf("\n");
std::cout << "排序后的数列为:";
for (int i = 1; i <= len; ++i)
{
std::cout << data.r[i] << ' ';
}
}