アルゴリズムのスクロール番号を探しています。
1、2、3、4 の数字を持つ配列があります。新しい配列を 4,1,2,3 にしたいと思います。
誰もこれを行う方法を知っていますか?
しかし、D[4] だけではありません。1、2、3、4、5、6、7
剰余算術を使用することは、おそらく最も洗練された方法です。たとえば、次のようにできます。
int a[size];
int b[size];
for (int n=0; n<size; n++)
b[(n+1)%size] = a[n];
要素を複数の位置に移動する必要がある場合は、b[(n+1)%size]
tob[(n+2)%size]
などに変更できます。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* Assumed slide is >= 0 and < arr_len. */
void slide_arr(int * arr, int arr_len, int slide)
{
int i;
/* If you are using C99, variable length array would be useful. */
int * tmp_arr = malloc(arr_len * sizeof(int));
memcpy(tmp_arr, arr, arr_len * sizeof(int));
for(i = 0; i < arr_len; i++) {
arr[i] = tmp_arr[(slide + i) % arr_len];
}
free(tmp_arr);
}
int main(void)
{
int i;
int arr[] = {1, 2, 3, 4, 5};
slide_arr(arr, _countof(arr), 2);
for(i = 0; i < _countof(arr); i++) {
printf("%d, ", arr[i]);
}
return EXIT_SUCCESS;
}
配列が与えられた場合、as1は{1, 2, 3, 4, 5}
次slide_arr()
のslide
ようになります。
{5, 1, 2, 3, 4}
2の場合slide
、次のようになります。
{4, 5, 1, 2, 3}
私はこれをVC++で書きました。GCCでコンパイルする場合は、ARRAY_SIZE
の代わりにを使用してください_countof
。
その場でのバージョン:
#include <stdio.h>
void swap(int* a, int* b){
int temp = *a;
*a = *b;
*b = temp;
}
int main(){
int i;
int size = 4;
int arr[4] = {1,2,3,4};
for(i = 0; i < size; i++){
printf("%d, ", arr[i]);
}
printf("\n");
for( i = size-1; i > 0; i-- ){
swap(&arr[i],&arr[i-1]);
}
for(i = 0; i < size; i++){
printf("%d, ", arr[i]);
}
リストが十分に小さい場合は、1 つの大きな配列でリストを 2 倍にし、ポインターが大きな配列をトラバースするようにすることができます。C でこれを行う方法が正確にはわかりませんが、うまくいけば C++ の例で要点がわかるでしょう。
int x[] = { 1, 2, 3, 4, 1, 2, 3 };
次に、次のように 2 番目のポインターを配列の上に移動させることができます。
int* noshift = x;
int* oneshift = x + 1;
int* twoshift = x + 2;
int* threeshift = x + 3;
4 番目のシフトは、この例ではシフトしないことと同じです。これにより、わずかに多くのメモリが必要になります。要素の配列の場合n
、これは配列2*n-1
内の要素を占有しますが、時間とメモリとすべてのジャズが関係します。
#include <stdio.h>
int main(){
int i;
int len = 5;
int arr = {1,2,3,4,5};
int last = arr[len-1]; // Last element of the array example(5)
for(i = len - 1; i > 0 ; i--)
arr[i] = arr[i-1];
arr[0] = last;
retrurn 0;
}