Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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++ C++;数组";削减;算法_C++ - Fatal编程技术网

C++ C++;数组";削减;算法

C++ C++;数组";削减;算法,c++,C++,是否有一种方法可以交换阵列的两个部分,而无需创建新的部分?就像剪一副牌?我可以通过分配一个新数组,然后先插入顶部扇区,然后插入底部扇区元素来实现这一点 我尝试在不使用额外数组的情况下执行此操作,并使用两个临时变量来保存元素,同时算法在节之间进行交换。问题是,我的尝试适用于特定的案例 例如: 原始阵列: 01 2 | 3 4 5 6 7 在索引2处剪切 交换阵列: 3 4 5 6 7 | 0 1 2是的,您可以存储下半部分的第一个元素,将上半部分向右移动。将第0个数组元素分配给此存储的数字。您刚刚

是否有一种方法可以交换阵列的两个部分,而无需创建新的部分?就像剪一副牌?我可以通过分配一个新数组,然后先插入顶部扇区,然后插入底部扇区元素来实现这一点

我尝试在不使用额外数组的情况下执行此操作,并使用两个临时变量来保存元素,同时算法在节之间进行交换。问题是,我的尝试适用于特定的案例

例如:

原始阵列: 01 2 | 3 4 5 6 7

在索引2处剪切

交换阵列:


3 4 5 6 7 | 0 1 2

是的,您可以存储下半部分的第一个元素,将上半部分向右移动。将第0个数组元素分配给此存储的数字。您刚刚将下半场的第一个数字移到了起点。为下一步等重复

守则草案:

for(int i = start; i < arr.size(); i++){
    double temp = arr[i];
    for(int j = start-1; j > i - start; j--){
        arr[j+1] = arr[j];
    }
    arr[i - start] = temp;
}
for(int i=start;ii-start;j--){
arr[j+1]=arr[j];
}
arr[i-启动]=温度;
}

是的,您可以存储下半部分的第一个元素,将上半部分向右移动。将第0个数组元素分配给此存储的数字。您刚刚将下半场的第一个数字移到了起点。为下一步等重复

守则草案:

for(int i = start; i < arr.size(); i++){
    double temp = arr[i];
    for(int j = start-1; j > i - start; j--){
        arr[j+1] = arr[j];
    }
    arr[i - start] = temp;
}
for(int i=start;ii-start;j--){
arr[j+1]=arr[j];
}
arr[i-启动]=温度;
}

您可以使用
std::rotate
执行此任务。它对集合中的数据进行左旋转,因此您可以指定一个“切割”点,并移动元素,以便紧跟在指定切割点之后的元素位于起点,而在切割点之前的元素将移动到终点


您可以使用
std::rotate
执行此任务。它对集合中的数据进行左旋转,因此您可以指定一个“切割”点,并移动元素,以便紧跟在指定切割点之后的元素位于起点,而在切割点之前的元素将移动到终点


“…但是写下来会有点混乱”-呃,什么?我不知道是否有。移动另一半时,需要将数组临时存储在某个位置。我应该使用更好的词语选择。我的意思是在数组中任意索引的两个扇区之间进行交换,这可能会澄清:在O(n)时间内,这是一个微不足道的示例。见杰瑞的答案。你也可以通过三个巧妙的
std::reverse()
调用来完成它。”…但是写下来会有点混乱。”-呃,什么?我不知道是否有。移动另一半时,需要将数组临时存储在某个位置。我应该使用更好的词语选择。我的意思是在数组中任意索引的两个扇区之间进行交换,这可能会澄清:在O(n)时间内,这是一个微不足道的示例。见杰瑞的答案。您还可以通过三个巧妙的
std::reverse()
调用来实现这一点。+1个很好的解释。一般性评论中提到的三逆方法是在漂亮的std::rotate之前实现这一点的常用方法。对于任何对某种方法感兴趣的人来说,这是可行的。对于那些感兴趣的人来说,David Gries的《编程科学》有一整节(18.1)专门讨论这个问题,并且提出了一种(尾部)递归算法(与GCD算法密切相关),其中等长的部分被前后交换;“基于反向”的算法留作练习,第三种算法(“dolphin算法”)也被提及,即取出一个元素并将其移动到其目的地,敲掉下一个元素,依此类推@DanielKO:MSVC库
std::rotate
实现了这三种方法,并根据迭代器的类型选择了一种方法。+1很好的解释。一般性评论中提到的三逆方法是在漂亮的std::rotate之前实现这一点的常用方法。对于任何对某种方法感兴趣的人来说,这是可行的。对于那些感兴趣的人来说,David Gries的《编程科学》有一整节(18.1)专门讨论这个问题,并且提出了一种(尾部)递归算法(与GCD算法密切相关),其中等长的部分被前后交换;“基于反向”的算法留作练习,第三种算法(“dolphin算法”)也被提及,即取出一个元素并将其移动到其目的地,敲掉下一个元素,依此类推@DanielKO:MSVC库
std::rotate
实现了这三种方法,并根据迭代器的类型选择一种。