数据结构(14) - 希尔排序
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
1 /** 2 * C data structure shell sort example. 3 * 4 * License - MIT. 5 */ 6 7 #include <stdio.h> 8 9 10 #define DISPLAY_ARRAY(i, buf, len) \ 11 do { \ 12 for (i = 0; i < len; i++) \ 13 printf("%d ", buf[i]); \ 14 printf("\n"); \ 15 } while(0) 16 17 18 /** 19 * shell_sort - Shell sort. 20 */ 21 int shell_sort(int *buf, int len) 22 { 23 int i = -1, 24 j = -1, 25 pos = -1, 26 tmp = -1; 27 28 for (pos = len / 2; pos > 0; pos /= 2) { 29 for (i = pos; i < len; i++) { 30 tmp = buf[i]; 31 32 for (j = i - pos; j > -1; j -= pos) { 33 if (tmp >= buf[j]) 34 break; 35 else 36 buf[j + pos] = buf[j]; 37 } 38 39 buf[j + pos] = tmp; 40 } 41 } 42 43 return 0; 44 } 45 46 47 /** 48 * Main function. 49 */ 50 int main(void) 51 { 52 int i = 0; 53 int buf[] = {49, 76, 19, 67, 5, 15, 89, 47, 44, 53}; 54 int len = sizeof(buf) / sizeof(int); 55 56 printf("The original array:\n"); 57 DISPLAY_ARRAY(i, buf, len); 58 59 shell_sort(buf, len); 60 61 printf("The sort array:\n"); 62 DISPLAY_ARRAY(i, buf, len); 63 64 return 0; 65 }
详情可参考Github: [Link] [https://github.com/Phoebus-Ma/C-Helper/tree/main/Class-1/Sort.C].