在条件与外部获取数组元素的结果不同

Different results getting array element inside while condition vs outside

本文关键字:结果 数组元素 获取 条件 外部      更新时间:2023-10-16

我已经在这个快速排序代码上工作了一段时间,不明白为什么我会根据获取数组值的位置获得不同的结果。如果我在循环之外获得pivot的值,它会很好地工作,而在循环内部则不会。

我已经用一些/*这很管用/不管用*/注释强调了每个函数之间的区别。

#include <stdio.h>
void quicksort(int * x, int left_limit, int right_limit) {
    int left = left_limit;
    int right = right_limit;
    int pivot = x[(right + left) / 2];        /* This works */
    while (left <= right) {
        while (x[left] < pivot) { left++;  }  /* This works */
        while (x[right] > pivot){ right--; }  /* This works */
        if (left <= right) {
            int temp = x[left];
            x[left] = x[right];
            x[right] = temp;
            left++;
            right--;
        }
    }
    if (left_limit < right)
        quicksort(x, left_limit, right);
    if (left < right_limit)
        quicksort(x, left, right_limit);
}
void quicksortBROKEN(int * x, int left_limit, int right_limit) {
    int left = left_limit;
    int right = right_limit;
    int pivot = (right + left) / 2;              /* This doesnt */
    while (left <= right) {
        while (x[left] < x[pivot]) { left++;  }  /* This doesnt */
        while (x[right] > x[pivot]){ right--; }  /* This doesnt */
        if (left <= right) {
            int temp = x[left];
            x[left] = x[right];
            x[right] = temp;
            left++;
            right--;
        }
    }
    if (left_limit < right)
        quicksort(x, left_limit, right);
    if (left < right_limit)
        quicksort(x, left, right_limit);
}
int main() {
    int x[] = {0,2,1,4,3,5,6,3,7,8,4,3,7,8};
    quicksort(x, 0, 13);
    for (int i = 0; i < 14; i++) {
        printf("%d, ", x[i]);
    }
    printf("n");
    return 0;
}

坏掉的函数出了什么问题?

在损坏的版本中,枢轴的(与其位置相反)在函数过程中发生变化。

Debugger可能会向您展示它的最佳效果,但函数之间有明显的区别。

第一个从数组中取一个值到变量,并且不改变它

第二个取一个位置,每次比较数组中该位置的值,同时修改数组。如果在存储的位置上修改了数组,则比较自然会有所不同。