数据结构(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].

posted @ 2022-06-25 17:56  this毛豆  阅读(27)  评论(0编辑  收藏  举报