【问题标题】:Sorting Algorithm Not Passing排序算法不通过
【发布时间】:2018-12-01 10:07:48
【问题描述】:

我正在尝试获取一个文件并通过排序算法运行它,在这种情况下是插入排序。在我通过算法并打印数组后,它看起来没有排序。我的想法是因为我试图将数组传递给函数,并通过指针查看信息,但我认为我搞砸了。

void insertionSort(int arr[]) {
    int key, j;
    for(int i = 1; i < (sizeof(arr) / sizeof(int)); i++) {
        int key = arr[i];
        int j = i-1;
        while(j >= 0 && arr[j] > key) {
            arr[j+1] = arr[j];
            j = j - 1;
        }
        arr[j+1] = key;
    }
}

我将函数设置为 void 因为我认为我可以访问数组,因为它是一个指针。如果我返回数组会更好吗?我的逻辑显然是错误的,所以任何指针(不是双关语)都会很棒。

这是我main()的代码块

case 2:
    printf("Filling array...\n");

    fp = fopen("Random.txt", "r");
    if (fp == NULL) {
        printf("\nError opening Random.txt\n");
        exit(1);
    }

    for (int i = 0; i < (sizeof(arr) / sizeof(int)); i++) {
        fscanf(fp, "%d", &arr[i]);
    }

    insertionSort(arr);

    for (int i = 0; i < (sizeof(arr) / sizeof(int)); i++) {
        printf("%d\n", arr[i]);
    }

    fclose(fp);
    break;
}

【问题讨论】:

  • 提示 1:void insertionSort(int arr[]) {void insertionSort(int *arr) { 完全相同(是的,即使你写 [] 也是一个指针)。提示 2:sizeof(int*)/sizeof(int) 是什么?
  • insertionSort 例程中的 sizeof(arr) 将是 sizeof(int*) ,即 8 个字节,因此您实际在做的是 8 / 4 ,即 2
  • @immibis 我正在使用sizeof 来遍历整个数组。我的印象是我不能使用 .length() 例如因为 C 不是 OOP? @0.sh 阅读上面的评论。使用sizeof 遍历数组。如果有更好的方法,我愿意接受。
  • sizeof(arr) / sizeof(int) = 2 on x86_64 和 1 on x86。
  • @InfoSecNick 除了arr(在函数中)不是数组。

标签: c arrays algorithm sorting pointers


【解决方案1】:
void insertionSort(int arr[]) {

数组在传递给函数时会衰减为指针,所以这基本上是

void insertionSort(int *arr) {

这意味着这不会给你数组中元素的数量

for(int i = 1; i < (sizeof(arr) / sizeof(int)); i++) {

您需要将数组的大小显式传递给函数。

void insertionSort(int arr[], int size) {
    for (int i = 1; i < size; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}

调用函数:

insertionSort(arr, sizeof(arr) / sizeof(int));

在创建数组的main()中,可以使用sizeof(A) / sizeof(int),因为main()知道数组的大小。

【讨论】:

  • 换句话说,sizeof (array) 仅报告数组的大小在声明array 的范围内。否则,它只是sizeof (a pointer)
  • 啊,我不知道数组衰减为指针。这有什么理由吗?或者这只是C?再次感谢。
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
相关资源
最近更新 更多