gpt4 book ai didi

c - 数组将数字列表中的相同数字存储两次

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:52 24 4
gpt4 key购买 nike

我的程序所做的是获取从文件中读入的数字数组,并使用选择排序和冒泡排序方法对它们进行排序。当通过冒泡排序方法排序时,数组连续两次列出一个数字。它也总是被复制的第二个数字。我检查了是否出于某种原因,该数字实际上两次传递给了新数组,但事实并非如此。我还尝试了一个不同的输入文件,同样的事情发生在同一个地方。这也切断了列表中的最后一个数字。我在我的代码中没有看到任何导致这种情况发生的明显原因。

程序调用的列表如下:

10

50

78

83

92

100

0

4

72

3

19

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int findMin(int arr[], int start, int size);
void printArr(int arr[], int size);
void selectionSort(int arr[], int size);
void bubbleSort(int arr[], int size);

int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("Syntax Error: ./<exec> <infile>\n");
exit(1);
}

FILE *ifp = NULL;
ifp = fopen(argv[1], "r");

if(ifp == NULL)
{
printf("Could not open %s for reading\n", argv[1]);
exit(1);
}

int counter;
int j = 0;

fscanf(ifp, "%d", &counter);

int array[counter];
int arrB[counter];
for(j = 0; j < counter; ++j)
{
fscanf(ifp, "%d", &array[j]);
}

for(j = 0; j < counter; j++)
{
arrB[j] = array[j];
}
int size = sizeof(array) / sizeof(int);

printf("Before: ");
printArr(array, size);

selectionSort(array, size);
bubbleSort(arrB, size);

fclose(ifp);

return 0;
}
int findMin(int arr[], int start, int size)
{
int i = 0;
int minLoc = start;
int minVal = arr[minLoc];

for ( i = start + 1; i < size; ++i)
{
if (arr[i] < minVal)
{
minVal = arr[i];
minLoc = i;
}
}

return minLoc;
}

void printArr(int arr[], int size)
{
int i = 0;

for(i = 0; i < size; ++i)
printf("%3d ", arr[i]);
printf("\n");
}
void selectionSort(int arr[], int size)
{
int i = 0;
int minLoc = 0;
int tmp = 0;
for(i = 0; i < size; ++i)
{
minLoc = findMin(arr, i, size);
tmp = arr[i];
arr[i] = arr[minLoc];
arr[minLoc] = tmp;
}

printf("** Selection Sort **\n After: ");
printArr(arr, size);

}
void bubbleSort(int arr[], int size)
{
int i = 0;
int j = 0;
int tmp = 0;

for(j = 0; j < size; j++)
{
for(i = 0; i < size; ++i)
{
if(arr[i] > arr[i+1])
{
tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
}
}
}
printf("** Bubble Sort **\n After: ");
printArr(arr, size);

}

最佳答案

bubbleSort() 访问数组边界之外。因此未定义的行为 (UB)。

for(j = 0; j < size; j++) {
for(i = 0; i < size; ++i) {
if(arr[i] > arr[i+1]) { // Here code access outside bounds when i = size - 1
... Code swaps arr[i], arr[i+1];
}
}
}

代替

for(j = 0; j < size; j++) {
for(i = 1; i < size; ++i) {
if(arr[i-1] > arr[i]) {
... Code swaps arr[i-1], arr[i];
}
}
}

关于c - 数组将数字列表中的相同数字存储两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43433001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com