我遇到了问题。我需要以不同的方式对数组进行排序。问题是在我对它进行第一次排序后,原始数组仍然保持排序状态。我尝试将原始数组复制到另一个数组,但仍保持排序。我的代码如下:
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);
}
答案 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
}