实习之路--点滴积累五_希尔
接下来说说希尔排序。
原理:
(1)将数组分为多个组,每个组的组内的元素位置相隔一个“增量”
(2)对每个组进行插入排序
(3)将“增量”值减少,然后循环
需要说明的是:
(1)“增量”值的选择问题,最后一个一定是1,比如,可以为,5、3、1或者5、2、1
代码如下:
1 void Shell_Sort(long *p, long n) 2 { 3 long gap = n / 2; 4 while (gap) 5 { 6 for (long i = 0; i < gap; i++) 7 { 8 for (long j = i + gap; j < n; j += gap) 9 { 10 if (p[j] < p[j - gap]) 11 { 12 int k = j - gap; 13 int temp = p[j]; 14 while ( k >= 0 && temp < p[k]) 15 { 16 p[k + gap] = p[k]; 17 k -= gap; 18 } 19 p[k + gap] = temp; 20 } 21 } 22 } 23 gap /= 2; 24 } 25 }
测试用例:
1 int main() 2 { 3 long s[] = { 3, 8, 1, 9, 10, 4, 2, 7, 5, 6 }; 4 Shell_Sort(s, 10); 5 for (long i = 0; i < 10; i++) cout << s[i] << ends << ends; 6 return 0; 7 }
实验截图: