C++ 插入排序:为什么将键分配给j+;1索引? void insertionSort(向量&v){ 对于(int i=1;i=0&&key
在插入排序算法中,我只是想知道为什么要插入注释部分。 我做了几次实验去掉了那个部分,实际上我认为去掉它是可以的C++ 插入排序:为什么将键分配给j+;1索引? void insertionSort(向量&v){ 对于(int i=1;i=0&&key,c++,sorting,C++,Sorting,在插入排序算法中,我只是想知道为什么要插入注释部分。 我做了几次实验去掉了那个部分,实际上我认为去掉它是可以的 有人能解释一下这条线路的用途吗?任何帮助都将不胜感激 因为在每次交换后它都会进行j--,在最后一次交换(释放v[j])后,它会再次减少j。因此,您需要将新元素置于v[j+1] 顺便说一下,此代码不需要交换,您可以使用v[j+1]=v[j]而不是swap 编辑 关于实现的问题,也许作者提出了一个需要交换的观点-在不了解上下文的情况下,我们不能确定 由于没有人真正使用插入排序,我认为这只是
有人能解释一下这条线路的用途吗?任何帮助都将不胜感激 因为在每次交换后它都会进行
j--
,在最后一次交换(释放v[j]
)后,它会再次减少j
。因此,您需要将新元素置于v[j+1]
顺便说一下,此代码不需要交换,您可以使用v[j+1]=v[j]
而不是swap
编辑
关于实现的问题,也许作者提出了一个需要交换的观点-在不了解上下文的情况下,我们不能确定
由于没有人真正使用插入排序,我认为这只是理论上的,可能是通过计算交换的数量来计算复杂性。因此,作者可能已经用swap
作为构建块演示了排序
回到问题上来
如果您对swap
所做的额外写入操作感到满意,那么实现是正确的
(本质上,swap(a,b)
是t=a;a=b;b=t;
,因此还有两次写入。)
如果您确实有交换
,那么注释掉的行确实是不必要的
如果没有交换
,您可以将其重写为-
void insertionSort(vector<int>& v){
for(int i =1; i<v.size(); ++i){
int key = v[i];
int j = i - 1;
while(j>=0 && key < v[j]){
swap(v[j], v[j+1]);
j--;
}
v[j+1] = key; // works fine without this.
}
}
void insertionSort(向量&v){
对于(int i=1;i=0&&key
请注意,由于这只减少了一个常数所需的渐近时间,复杂性仍然与使用交换时的复杂性相同,即$O(n^2)$。因为每次交换后它都会j--
,在最终交换(释放v[j]
)后,它再次降低j
。因此,您需要将新元素置于v[j+1]
顺便说一下,此代码不需要交换,您可以使用v[j+1]=v[j]
而不是swap
编辑
关于实现的问题,也许作者提出了一个需要交换的观点-在不了解上下文的情况下,我们不能确定
由于没有人真正使用插入排序,我认为这只是理论上的,可能是通过计算交换的数量来计算复杂性。因此,作者可能已经用swap
作为构建块演示了排序
回到问题上来
如果您对swap
所做的额外写入操作感到满意,那么实现是正确的
(本质上,swap(a,b)
是t=a;a=b;b=t;
,因此还有两次写入。)
如果您确实有交换
,那么注释掉的行确实是不必要的
如果没有交换
,您可以将其重写为-
void insertionSort(vector<int>& v){
for(int i =1; i<v.size(); ++i){
int key = v[i];
int j = i - 1;
while(j>=0 && key < v[j]){
swap(v[j], v[j+1]);
j--;
}
v[j+1] = key; // works fine without this.
}
}
void insertionSort(向量&v){
对于(int i=1;i=0&&key
请注意,由于这只减少了一个常数所需的渐近时间,因此复杂性仍然与使用交换时的复杂性相同,即$O(n^2)$。您从何处获得代码,如何确保它实际上是正确的?你有没有在缺线的情况下进行过彻底的练习?“我做了几次实验去掉了那个部分,实际上我认为去掉它是可以的。”你能科学地向我们解释这些实验吗?展示你的工作。你是从哪里得到代码的,你如何确保它是正确的?你有没有在缺线的情况下进行过彻底的练习?“我做了几次实验去掉了那个部分,实际上我认为去掉它是可以的。”你能科学地向我们解释这些实验吗?显示您的working.swap对于插入排序甚至是不正确的。很多不必要的额外写作。谢谢大家的评论。这些代码来自程序员的博客。我认为这在很多方面都是错误的。如果您不介意的话,您能告诉我什么是cpp中插入排序的正确实现吗?该实现是正确的,作者可能是在提出一个理论观点。或者,您可以将交换
更改为一个赋值-尽管它不会改变复杂性,但运行时会减少一个常数因子。直接在answer.swap中添加注释甚至不适用于插入排序。很多不必要的额外写作。谢谢大家的评论。这些代码来自程序员的博客。我认为这在很多方面都是错误的。如果您不介意的话,您能告诉我什么是cpp中插入排序的正确实现吗?该实现是正确的,作者可能是在提出一个理论观点。或者,您可以将交换
更改为一个赋值-尽管它不会改变复杂性,但运行时会减少一个常数因子。直接添加评论以回答问题。