由于课程未给出希尔排序,我便尝试着写一写,花了一个下午效率很低,但是还是云里雾里的,有这么三个问题:
既然ShellSort的思想是对每个子序列再进行InsertionSort,那么第二层for循环里的i应该i<子序列.length 才对,但是在第三层for中j=j-dk似乎又向我说:没事,上面就写i<n就好。就是有这种直观感性的直觉。请问怎么理解二层中的i<n?子序列的长度明显不会是n,第一次选完步长一个子序列应该只有2个元素才对。
如果是奇数个的序列的话,肯定有落单的元素,代码是通过什么样的逻辑处理这个单独的人呢?
我的代码是根据课程中的InsertionSort写的,我想知道到底对不对。。。测试了一下感觉好像没问题,但是不知道到底是不是没问题。
template<typename T> void ShellSort(T arr[],int n){ for (int dk = n/2; dk >=1; dk=dk/2) /*Shell排序,初始步长使之为序列长度的一般,也就是一开始分两组; 往后步长自取一半,直到最后为1,对整个序列进行直接插入*/ { for (int i = dk; i < n; i++) { T e = arr[i]; int j; for (j = i; j > 0 && arr[j - dk] > e; j -= dk) { arr[j] = arr[j - dk]; } arr[j] = e; } } for (int count = 0; count < n; count++) { cout << arr[count] << endl; } }