C语言 数组存储相同的数字,形成两次数字列表



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

程序调用的列表如下:

10

50

78

83

92

100

0

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 readingn", 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];
        }
    }
}

最新更新