Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是shell排序还是插入排序?_C++_C_Algorithm_Sorting - Fatal编程技术网

C++ 这是shell排序还是插入排序?

C++ 这是shell排序还是插入排序?,c++,c,algorithm,sorting,C++,C,Algorithm,Sorting,我刚刚开始学习排序算法,并在网上找到了一个。起初我认为它是一个shell排序,但它缺少了“k”的明显间隔和数组的减半,所以我不确定它是否是。我的第二个猜测是插入排序,但我只是来仔细检查一下: for(n = 1; n < num; n++) { key = A[n]; k = n; while((k > 0) && (A[k-1] > key)) { A[k] = A[k-1]; k = k-1;

我刚刚开始学习排序算法,并在网上找到了一个。起初我认为它是一个shell排序,但它缺少了“k”的明显间隔和数组的减半,所以我不确定它是否是。我的第二个猜测是插入排序,但我只是来仔细检查一下:

for(n = 1; n < num; n++)
{
    key = A[n];
    k = n;
    while((k > 0) && (A[k-1] > key))
    {
        A[k] = A[k-1];
        k = k-1;    
    }
    A[k] = key;
}
(n=1;n { 键=A[n]; k=n; while((k>0)和&(A[k-1]>键)) { A[k]=A[k-1]; k=k-1; } A[k]=键; }
另外,如果你能解释为什么这也会有帮助的话,我想你是对的,这看起来确实很像一个例子

此片段假定已插入[0]。如果
n==0
,则
k>0
检查将失败,并在
A[k]=键处继续执行,将第一个元素正确存储到数组中

此片段还假设
A[0:n-1]
已排序。它检查
A[n]
并开始向后扫描数组,将大于原始
A[n]
键的每个元素向前移动一个位置

一旦扫描遇到小于或等于键的元素,它就会将其插入该位置。

由许多插入排序组成,这些排序在原始数组的子数组上执行

您提供的代码是插入排序


要获得shell排序,大致上需要在您的代码周围有其他
for
,更改
h
(shell排序中的间隙)并开始子数组和内部的索引,而不是从
k
移动到
k-1
,而是从
k
移动到
k+h
(或
k-h
取决于执行插入排序的方向)

之所以称为插入排序,是因为行
A[k]=key
将当前值插入部分排序数组中的正确位置。

好吧,让我们看看……是的,我非常确定这是一种插入排序。Wikipedia让我感到困惑,因为它给了我很多让我难以理解的词。它确实是一种插入排序,看看Wikipedia动画,看看为什么发布的代码遵循相同的顺序行为,FWW,一个经常被忽视的排序。@ DeadMG,C或C++,这有什么区别?它不假设一个[0 ]被排序,A(0)用[k-1,k>=1(1的第一个循环n)来检查……索引是偏移的-1与标准伪代码的+1。@ PST,谢谢强迫我再看一看。当然(像往常一样)。你是对的——我注意到
k>0
保护,但是失败案例将密钥插入
A[0]
中很好。@pst,它是插入排序,因此在应用
n=1
的案例之前,它假设数组只有一个元素,即
A[0]
,显然,一个具有一个元素的数组总是被排序的。