到目前为止,我的程序根据用户声明的大小创建了一个数组。程序然后用500到600之间的随机数填充该数组,并打印其中的4个数字并创建一个新行以继续打印它们。到目前为止,一切正常。在假设以升序重新打印数字的部分出现问题并且仅重新打印一些数字而不是以任何顺序重新打印。任何有关如何纠正这一点的帮助表示赞赏。
int main(){
int size;
int j, i;
int temp;
int a=0;
double sum = 0;
printf("Enter size of array ");
scanf("%d", &size);
int* array;
array=malloc(size * sizeof(*array));
int *aPtr = array;
srand(time(NULL));
for (i = 0; i < size; i++){
aPtr[i] =(rand() % 101) + 500;
printf("%d ", aPtr[i]);
a++;
if (a == 4){
printf("\n");
a = 0;
}
}
printf("\n\n\nIn ascending order\n");
for (i = 0; i< size; i++){
for (j = 0; j < size; j++){
if(aPtr[i] > aPtr[j]);
temp=aPtr[i];
aPtr[i]=aPtr[j];
aPtr[j]=temp;
}
printf("%d\n", aPtr[i]);
}
答案 0 :(得分:1)
问题是&lt;签名,if语句不在其自己的括号中。第二个用于打印的循环也有助于正确打印数组
printf("\n\n\nIn ascending order\n");
for (i = 0; i < size; i++){
for (j = i+1; j < size; j++){
if(aPtr[i] > aPtr[j]){
temp=aPtr[i];
aPtr[i]=aPtr[j];
aPtr[j]=temp;
}
}
}
for (j = 0; j<size; j++)
printf("%d\n", aPtr[j]);
答案 1 :(得分:0)
问题在于排序循环中的if-test(重新格式化):
for (i = 0; i< size; i++){
for (j = 0; j < size; j++){
if(aPtr[i] > aPtr[j]);
temp=aPtr[i];
aPtr[i]=aPtr[j];
aPtr[j]=temp;
}
printf("%d\n", aPtr[i]);
}
您正在交换每个值,因为您没有在if块中添加任何内容。这应该以最小的更改修复您的代码:
for (i = 0; i< size; i++){
for (j = 0; j < size; j++){
if(aPtr[i] > aPtr[j]) {
temp=aPtr[i];
aPtr[i]=aPtr[j];
aPtr[j]=temp;
}
}
printf("%d\n", aPtr[i]);
}
请注意,使用冒泡排序时,您只需要搜索最小元素的索引并交换一次。你每次交换都是多余的。您也不需要在内部j
循环中从零开始循环,因为i
之前的所有内容都已经排序。
int minidx;
for (i = 0; i< size; i++) {
/* Find index of smallest element in the rest of the array */
minidx = i;
for (j = i+1; j < size; j++) {
if(aPtr[j] < aPtr[minidx]) minidx = j;
}
/* Swap if necessary */
if (minidx != i ) {
temp = aPtr[i];
aPtr[i] = aPtr[minidx];
aPtr[minidx] = temp;
}
/* The element at i is now sorted */
printf("%d\n", aPtr[i]);
}