转一段代码,帮助理解Shell排序
#include <stdio.h> #include <stdlib.h> #define ARRAY_LENGTH 9 void shellsort(int v[], int n); void arrayPrintf(int v[], int n); void traceShellsort(int v[], int n); int traceOut(int n, int gap, int i, int j, int isnewline); int traceCount; int main(void) { int arr[ARRAY_LENGTH] = { 12, 2, 20, 19, 28, 30, 12, 42, 35 }; printf("Original array:/t/t"); arrayPrintf(arr, ARRAY_LENGTH); /*sort the array by shell arithmetic*/ //shellsort(arr, ARRAY_LENGTH); traceShellsort(arr, ARRAY_LENGTH); putchar('/n'); printf("MinToMax array:/t/t"); arrayPrintf(arr, ARRAY_LENGTH); return EXIT_SUCCESS; } /*shellsort函数:按递增顺序对v[0]…v[n-1]进行排序*/ void shellsort(int v[], int n) { int gap, i, j, temp; for (gap = n / 2; gap > 0; gap /= 2) { for (i = gap; i < n; i++) { for (j = i - gap; j >= 0 && v[j] > v[j + gap]; j -= gap) { temp = v[j]; v[j] = v[j + gap]; v[j + gap] = temp; } } } } /*shell排序算法的跟踪版,相同的算法,它将输出带有跟踪过程的数据*/ void traceShellsort(int v[], int n) { int gap, i, j, temp; extern int traceCount; traceCount = 1; for (gap = n / 2; gap > 0; gap /= 2) { for (i = gap; i < n; i++) { for (j = i - gap; traceOut(n, gap, i, j, !(j >= 0 && v[j] > v[j+ gap])) && j >= 0 && v[j] > v[j + gap]; j -= gap ) { temp = v[j]; v[j] = v[j + gap]; v[j + gap] = temp; arrayPrintf(v, n); } } } } /*用于跟踪交换过程*/ int traceOut(int n, int gap, int i, int j, int isnewline) { printf("%2d. n=%d gap=%d i=%d j=%2d %c", traceCount++, n, gap, i, j,isnewline ? '/n' : ' '); return 1; } /*用于输出一组数组*/ void arrayPrintf(int v[], int n) { int i; for (i = 0; i < n; i++) { printf("%d ", v[i]); } putchar('/n'); }
结构输出
Original array: 12 2 20 19 28 30 12 42 35
1. n=9 gap=4 i=4 j= 0
2. n=9 gap=4 i=5 j= 1
3. n=9 gap=4 i=6 j= 2 12 2 12 19 28 30 20 42 35
4. n=9 gap=4 i=6 j=-2
5. n=9 gap=4 i=7 j= 3
6. n=9 gap=4 i=8 j= 4
7. n=9 gap=2 i=2 j= 0
8. n=9 gap=2 i=3 j= 1
9. n=9 gap=2 i=4 j= 2
10. n=9 gap=2 i=5 j= 3
11. n=9 gap=2 i=6 j= 4 12 2 12 19 20 30 28 42 35
12. n=9 gap=2 i=6 j= 2
13. n=9 gap=2 i=7 j= 5
14. n=9 gap=2 i=8 j= 6
15. n=9 gap=1 i=1 j= 0 2 12 12 19 20 30 28 42 35
16. n=9 gap=1 i=1 j=-1
17. n=9 gap=1 i=2 j= 1
18. n=9 gap=1 i=3 j= 2
19. n=9 gap=1 i=4 j= 3
20. n=9 gap=1 i=5 j= 4
21. n=9 gap=1 i=6 j= 5 2 12 12 19 20 28 30 42 35
22. n=9 gap=1 i=6 j= 4
23. n=9 gap=1 i=7 j= 6
24. n=9 gap=1 i=8 j= 7 2 12 12 19 20 28 30 35 42
25. n=9 gap=1 i=8 j= 6
MinToMax array: 2 12 12 19 20 28 30 35 42
Press any key to continue