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

Array stores same number form a list of numbers twice

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

程序调用的列表如下:

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];
        }
    }
}