希尔排序是插入排序的改进版本。比起插入排序多了个步骤,先对元素进行分组,再进行插入排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #include <iostream> #include <vector> using namespace std;void ShellSort (vector<int >& vec) ;void Print (const vector<int >& vec) ;int main () { vector<int > vec = { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 }; cout << "before sort:" << endl; Print (vec); cout << "sort:" << endl; ShellSort (vec); cout << "after sort:" << endl; Print (vec); } void ShellSort (vector<int >& vec) { int length = vec.size (); int preIndex; int currentValue; for ( int gap = length / 2 ; gap > 0 ; gap /= 2 ) { for ( int i = gap; i < length; i++ ) { preIndex = i - gap; currentValue = vec[i]; while ( preIndex >= 0 && currentValue < vec[preIndex] ) { vec[preIndex + gap] = vec[preIndex]; preIndex -= gap; } vec[preIndex + gap] = currentValue; } Print (vec); } } void Print (const vector<int >& vec) { for ( const int v : vec ) { cout << v << " " ; } cout << endl; }
1️⃣ for( int i = gap; i < length; i++ ) i
从第一组的第二个元素开始,对应的索引就是 0+gap
, i++
后对应就是第二组的第二个元素,以此类推,第三组的第二个元素……而且要注意代码实现中,不是把分配到一组内的元素都插入排序后再轮到下一组,而是第一组的第二个元素进行完, i++
,轮到第二组的第二个元素,每一组的第二个元素都进行完后,轮到第一组的第三个元素进行插入排序。是按元素原本的顺序交叉进行的。