写出希尔排序的代码
#include<exception>
#include<iostream>
#include<functional>
#include<utility>
using namespace std;
using uint = unsigned int;
template<typename T>
void shellSort(T *data, const uint len, function<bool(T,T)> cmp) {
//检查参数的合法性
if (nullptr == data) throw invalid_argument("Array pointer is null");
if (0 == len) throw invalid_argument("Length of array is zero");
if (1 == len) return;
//设定增量div,并不断减小
for (uint div = len / 2; div > 0; div /= 2)
//分成div组
for (uint grpIdx = 0; grpIdx < div; ++grpIdx)
for (uint itmIdx = grpIdx; itmIdx < len - div; itmIdx += div)
//对每组进行插入排序
for (uint i = itmIdx; i < len; i += div)
if (! cmp(data[itmIdx], data[i])) swap(data[itmIdx], data[i]);
}
int main()
{
int arr[10] = { 5, 7, 1, 3, 6, 4, 8, 2, 9, 0 };
shellSort<int>(arr, 10, less<int>());
for (size_t nIdx = 0; nIdx < sizeof(arr)/sizeof(arr[0]); ++nIdx) {
std::cout << arr[nIdx] << " ";
}
std::cout << std::endl;
return 0;
}