- #include <iostream>
- #include <functional>
- #include <type_traits>
- template <typename T, size_t N>
- void print(T(&array)[N])
- {
- for (auto e: array) {
- std::cout <<e<<"\\t";
- }
- std::cout <<"\\n";
- }
- template <typename It>
- void print(It beg, It end)
- {
- for (;beg < end;++ beg) {
- std::cout <<*beg<<"\\t";
- }
- std::cout <<"\\n";
- }
- template <typename It, typename Cmp = std::less<typename std::iterator_traits<It>::value_type>>
- void shellSort(It beg, It end, Cmp cmp = Cmp())
- {
- if (beg == end) return ;
- typename std::iterator_traits<It>::value_type ins;
- size_t len = end - beg, cur = 0;
- for (size_t inc = len / 2;inc > 0;inc /= 2) {
- for (size_t i = inc;i < len;++ i) {
- ins = *(beg + i);
- /* ^cur is sorted */
- for (cur = i;cur >= inc;cur -= inc) {
- if (cmp(ins, *(beg + cur - inc))) {
- *(beg + cur) = *(beg + cur - inc);
- } else {
- break;
- }
- }
- *(beg + cur) = ins;
- }
- }
- }
- int main()
- {
- int array[] = {1, 5, 3, 4, 8};
- shellSort(array, array + 5);
- print(array);
- return 0;
- }
- //该片段来自于http://www.codesnippet.cn/detail/3012201514346.html
来源: http://www.codesnippet.cn/detail/3012201514346.html