C 如何使用序列{3,2,1}执行shell排序?

C 如何使用序列{3,2,1}执行shell排序?,c,algorithm,sorting,sequence,shellsort,C,Algorithm,Sorting,Sequence,Shellsort,假设我有一个数组: 30 20 29 19 28 18 27 17 26 16 25 15 24 14 23 13 22 12 21 11 我不理解如何使用序列3进行shell排序: 我是否可以这样做: 30 20 29 19 28 18 27 17 | 26 16 25 15 24 14 |23 13 22 12 21 11 我把它分成3个部分,然后分别排序?然后再对2个排序进行同样的操作,除了分成两半?正确的方法是什么?有人能解释一下吗?如果您查看阵列并对位置进行编号 1 2 3

假设我有一个数组:

30 20 29 19 28 18 27 17 26 16 25 15 24 14 23 13 22 12 21 11

我不理解如何使用序列3进行shell排序: 我是否可以这样做:

30 20 29 19 28 18 27 17 | 26 16 25 15 24 14  |23 13 22 12 21 11

我把它分成3个部分,然后分别排序?然后再对2个排序进行同样的操作,除了分成两半?正确的方法是什么?有人能解释一下吗?

如果您查看阵列并对位置进行编号

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
30 20 29 19 28 18 27 17 26 16 25 15 24 14 23 13 22 12 21 11
在shell排序中,您要做的是从一个跳过的数字开始(在您的案例3中),因此要生成第一个“列表”,您需要一个数字并跳过。如果是3,则为1、4、7等

所以你会有一份

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
30       19       27       16       24       13       21 
还有第二张名单

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
   20       28       17       25       14       22       11
第三个列表是剩余的项目

在下一轮中,你只需少做一次。。。所以奇数位置的项目和偶数位置的项目


回应以下评论

Shell排序是就地排序,这意味着您不会将项目删除到新列表或创建任何新的数据结构。您正在使用数组来“处理”在数组位置上“相距很远”的项,使它们彼此相邻。实际上,您并没有创建新的列表或新的数组(这就是为什么我像以前那样显示我的图表);你只要看看这些地方

为什么?


因为这意味着当你开始(例如3)时,你将把东西移得更远——例如,从位置16开始的13在第一次通过时被移到位置1。然后,当您减少数量时,您开始进行更多的本地更改。这意味着您比典型的冒泡排序有优势。仍然不好-但比气泡排序要好得多。

如果您查看阵列并对位置进行编号

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
30 20 29 19 28 18 27 17 26 16 25 15 24 14 23 13 22 12 21 11
在shell排序中,您要做的是从一个跳过的数字开始(在您的案例3中),因此要生成第一个“列表”,您需要一个数字并跳过。如果是3,则为1、4、7等

所以你会有一份

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
30       19       27       16       24       13       21 
还有第二张名单

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
   20       28       17       25       14       22       11
第三个列表是剩余的项目

在下一轮中,你只需少做一次。。。所以奇数位置的项目和偶数位置的项目


回应以下评论

Shell排序是就地排序,这意味着您不会将项目删除到新列表或创建任何新的数据结构。您正在使用数组来“处理”在数组位置上“相距很远”的项,使它们彼此相邻。实际上,您并没有创建新的列表或新的数组(这就是为什么我像以前那样显示我的图表);你只要看看这些地方

为什么?


因为这意味着当你开始(例如3)时,你将把东西移得更远——例如,从位置16开始的13在第一次通过时被移到位置1。然后,当您减少数量时,您开始进行更多的本地更改。这意味着您比典型的冒泡排序有优势。仍然不好-但比冒泡排序好得多。

1,2,3的序列对于shell排序没有意义-shell排序从一个高的数字开始,然后变小。。。你确定你不是说3,2,1吗?@Hogan这就是我的意思,对不起。在描述中,我从3开始。我该怎么做?不是那样的。对数组进行3排序意味着对3个索引分开的元素进行排序(如3个交错数组)。请阅读维基百科的文章,我认为它解释得很好。1,2,3的序列对shell排序没有意义-shell排序从一个高的数字开始,然后变小。。。你确定你不是说3,2,1吗?@Hogan这就是我的意思,对不起。在描述中,我从3开始。我该怎么做?不是那样的。对数组进行3排序意味着对3个索引分开的元素进行排序(如3个交错数组)。请阅读维基百科的文章,我认为这很好地解释了这一点。那么它会是这样的:“`301927162414211 | 29182615231212 |”`然后被分类为:``131919212430 | 1114172228 | 1218232629
。我的问题是,2-排序的顺序是这样的:
13 16 19 21 24 27 30 11 14 17 20 22 28 12 15 18 23 26 29```然后从2-排序开始,像这样的数组^。谢谢大家!@fresh42juice——见我的补充评论。那么它会是这样的:``30192716241321 ``202817211 `` 29182615231212 ``然后被分类为:``131919212430 `;1114172228 `
。我的问题是,2-排序的顺序是这样的:
13 16 19 21 24 27 30 11 14 17 20 22 28 12 15 18 23 26 29```然后从2-排序开始,像这样的数组^。谢谢大家!@fresh42juice——请参阅我的其他评论。