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中插入排序的正确实现吗?该实现是正确的,作者可能是在提出一个理论观点。或者,您可以将
    交换
    更改为一个赋值-尽管它不会改变复杂性,但运行时会减少一个常数因子。直接添加评论以回答问题。