一. 实现原理
基数排序的相关知识,参考漫画:什么是希尔排序?
二. 具体实现
void ShellSort(int* pData, int size)
{
if (nullptr == pData || size <= 1) return;
int gap = size / 2; // 增量
while (gap >= 1)
{
for (int idx = gap; idx < size; ++idx) // 从gap开始, idx - gap才有意义
{
int insertData = pData[idx]; // 待插入元素
int prevIdx = idx - gap;
while (prevIdx >= 0 && pData[prevIdx] > insertData)
{
pData[prevIdx + gap] = pData[prevIdx];
prevIdx -= gap;
}
if (prevIdx != idx - gap) pData[prevIdx + gap] = insertData;
}
gap /= 2; // 增量减半
}
}
三. 输出验证
加上相关的输出信息后再进行调用。
辅助函数
void Print(int* pData, int size)
{
for (int idx = 0; idx < size; ++idx) std::cout << pData[idx] << " ";
std::cout << std::endl;
}
初始数据为
int datas[6] = { 1, 2, 3, 2, 1, 6 };
输出版本
void ShellSort_Output(int* pData, int size)
{
if (nullptr == pData || size <= 1) return;
std::cout << "INIT DATA" << std::endl;
Print(pData, size);
int div = size / 2; // 增量
while (div >= 1)
{
std::cout << std::endl << "CUR DIV " << div << std::endl;
for (int idx = div; idx < size; ++idx) // 从gap开始, idx - gap才有意义
{
int insertData = pData[idx]; // 待插入元素
int prevIdx = idx - div;
std::cout << std::endl << "INSERT DATA " << insertData << std::endl;
while (prevIdx >= 0 && pData[prevIdx] > insertData)
{
pData[prevIdx + div] = pData[prevIdx];
prevIdx -= div;
}
pData[prevIdx + div] = insertData;
Print(pData, size);
}
div /= 2; // 增量折半
}
std::cout << std::endl << "FINAL DATA" << std::endl;
Print(pData, size);
}
调用输出
INIT DATA // 初始数据
1 2 3 2 1 6
CUR GAP 3 // 当前增量3
INSERT DATA 2
1 2 3 2 1 6
INSERT DATA 1
1 1 3 2 2 6
INSERT DATA 6
1 1 3 2 2 6
CUR GAP 1 // 当前增量1
INSERT DATA 1
1 1 3 2 2 6
INSERT DATA 3
1 1 3 2 2 6
INSERT DATA 2
1 1 2 3 2 6
INSERT DATA 2
1 1 2 2 3 6
INSERT DATA 6
1 1 2 2 3 6
FINAL DATA // 最终数据
1 1 2 2 3 6