#include <stdio.h> #include <stdlib.h> //希尔排序 //基本思想:也称为缩小增量排序;先分成多组,组的个数即增量的值;增量逐渐递减至1即组个数递减至1 //时间复杂度:nlogn //增量t的取法:最初shell提出取increment=n/2向下取整,increment=increment/2向下取整,直到increment=1。 //但由于直到最后一步,在奇数位置的元素才会与偶数位置的元素进行比较,这样使用这个序列的效率会很低。 //后来Knuth提出取increment=n/3向下取整+1.还有人提出都取奇数为好,也有人提出increment互质为好。 //应用不同的序列会使希尔排序算法的性能有很大的差异。 //希尔排序思想+插入排序 void ShellSort(int k[], int n) { int i, j, tmp; int step = n; do { step = step / 3 + 1; for (i = step; i < n; i++) { if (k[i] < k[i - step]) { tmp = k[i]; for (j = i - step; (j >= 0 )&&(k[j] > tmp); j -= step) { k[j + step] = k[j]; } k[j + step] = tmp; } } } while (step > 1); } //希尔排序思想+冒泡排序 void ShellSort2(int k[], int n) { int i, j, tmp; int step = n; do { step = step / 3 + 1; for (i = 0; i < n; i++) { for (j = i; j < n - step; j += step) { if (k[j] > k[j + step]) { tmp = k[j]; k[j] = k[j + step]; k[j + step] = tmp; } } } } while (step > 1); } void print(int a[], int num) { int i = 0; for (i = 0; i < num; i++) { printf("%d ", a[i]); } printf(" "); } int main() { int a[10] = { 2, 3, 56, 1, 4, 7, 8, 94, 3, 10 }; int b[10] = { 2, 3, 56, 1, 4, 7, 8, 94, 3, 10 }; print(a, 10); print(b, 10); ShellSort(a, 10); print(a, 10); ShellSort2(b, 10); print(b, 10); return system("pause"); }