C++ 这是shell排序还是插入排序?
我刚刚开始学习排序算法,并在网上找到了一个。起初我认为它是一个shell排序,但它缺少了“k”的明显间隔和数组的减半,所以我不确定它是否是。我的第二个猜测是插入排序,但我只是来仔细检查一下: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;
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]
,显然,一个具有一个元素的数组总是被排序的。