将数组复制到另一个而不修改原始数组的问题

时间:2019-11-17 04:04:24

标签: c sorting

我遇到了问题。我需要以不同的方式对数组进行排序。问题是在我对它进行第一次排序后,原始数组仍然保持排序状态。我尝试将原始数组复制到另一个数组,但仍保持排序。我的代码如下:


void printArray(int ** array, int n){
    int i;
    for(i = 0; i < n; i++){
        printf(" %d ", (*array)[i]);
    }
}

int main(){
    int *array, n, number, i, j;

    printf("\nIntroduce the size of the array:");
    scanf("%d", &n);
    array = (int*)malloc(n * sizeof(int));
    for(i = 0; i < n; i++){
        number = rand() % 1000 + 1;
        array[i] = number;
    }

    printf("\nUnsorted array:");
    printArray(&array, n);

    //bubble sort
    int *array2, aux;
    array2 = array;
    for (i = 0; i < n-1; i++){
        for (j = 0; j < n-1; j++){
            if(array2[j] > array2[j+1]){
                aux = array2[j];
                array2[j] = array2[j+1];
                array2[j+1] = aux;
            }
        }
    }
    printf("\nSorted array:");
    printArray(&array2, n);         

    //The problem is in here, if I print the original array, it's already sorted
    printf("\nUnsorted original array:");
    printArray(&array, n);

}

3 个答案:

答案 0 :(得分:1)

之所以会发生这种情况,是因为您只是将另一个指针(数组)变量分配给了内存中的同一地址,因此对初始数组进行了排序。

您要做的是分配内存并在对数组进行排序之前复制该数组。您可以使用与printArray()例程非常相似的方法:

void copyArray(int *old_array, int *new_array, int n){
    int i;
    for(i = 0; i < n; i++){
        new_array[i] = old_array[i];
    }
}

然后在main()中执行以下操作:

array2 = (int*)malloc(n * sizeof(int));
copyArray(array, array2, n);

答案 1 :(得分:1)

代替

array2 = array;

这样做

array2 = (int*)malloc(n * sizeof(int));
for(i = 0; i < n; i++){
     array2[i] = array[i];
}

答案 2 :(得分:0)

看,您实际上只在创建一个数组。最初,您使用指针变量“数组”指向该数组的基地址。 然后通过这样做,

array2 = array;

将数组的基地址(存储在指针变量“ array”中)复制到指针变量“ array2”,然后使用此“ array2”指针变量对原始(唯一的)数组进行排序。 / p>

要同时拥有已排序和未排序的数组,您需要复制原始数组,然后对其中的任何一个进行排序。 要创建原始数组的副本,请执行以下操作:

int *newArray=(int*)malloc(sizeof(int));    // dynamically allocating memory
for(i=0;i<n;i++){
newArray[i]=array[i];              // *(newArray+i)=*(array+i); alternative
}