2012-05-05 87 views
1

我正在尋找算法滾動編號例如;幻燈片算法

我有一個數組有1,2,3,4。我想讓我的新陣列4,1,2,3。

有誰知道如何做到這一點?

但不僅僅是D [4];它可以是1,2,3,4,5,6,7

+2

是否需要使用數組?因爲用鏈表執行此操作會更高效。一個循環鏈表會更好。 – Justin

回答

1

的替代版本:

#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]); 
} 
2

使用模塊化算術可能是最優雅的方法。例如,你可以做這樣的:

int a[size]; 
int b[size]; 

for (int n=0; n<size; n++) 
    b[(n+1)%size] = a[n]; 

如果你需要的元素轉變爲一個以上的位置,你可以改變b[(n+1)%size]b[(n+2)%size]等。

+0

當天的隨機事實:移動多個地方稱爲桶式移位器 - https://en.wikipedia.org/wiki/Barrel_shifter –

1
#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; 
} 

鑑於陣列{1, 2, 3, 4, 5}slide_arr()slide爲1會給:

{5, 1, 2, 3, 4} 

對於slide爲2時,它會給:

{4, 5, 1, 2, 3} 

我在VC寫這++。如果您正在編譯GCC,請使用ARRAY_SIZE而不是_countof

1

足夠小的列表,你可能會增加一倍於一體的大型陣列的列表,並有一個指針遍歷大陣。我不知道如何在C中執行此操作,但希望C++示例能夠解決這個問題。

int x[] = { 1, 2, 3, 4, 1, 2, 3 }; 

然後你可以有一個第二指針向上移動陣列像這樣:

int* noshift = x; 
int* oneshift = x + 1; 
int* twoshift = x + 2; 
int* threeshift = x + 3; 

第四移位相同在本例中不移位。這將佔用更多的內存。對於n元素的數組,這將佔用數組中的2*n-1元素,但時間與內存以及所有爵士音樂相關。

0
#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; 
} 
+1

感謝您發表了一個答案!雖然代碼片段可以回答這個問題,但添加一些附加信息仍然很棒,比如解釋等。 – j0k