C - 如何在排序时不更改 int 数组的值

作者:编程家 分类: arrays 时间:2025-05-11

在进行排序时,有时我们希望对一个整数数组进行排序,但又不想改变原始数组中元素的顺序。这种需求在某些算法和应用中可能会经常遇到。在C语言中,我们可以通过使用辅助数据结构或者自定义比较函数的方式来实现这一目标。在本文中,我们将介绍如何在排序时保持原始int数组的顺序,并提供一个简单的案例代码以说明这个概念。

### 保持排序时的不变性

为了在排序时保持原始数组的不变性,我们需要采用一些额外的手段。一种常见的方法是创建一个辅助数组,用于保存原始数组的索引,而不是直接操作原数组的元素。通过对索引数组进行排序,我们可以得到排序后的索引顺序,然后通过这个顺序访问原数组,而不改变原始数组的值。

### 案例代码

让我们通过一个简单的C语言案例代码来说明这个方法:

c

#include

#include

// 比较函数,用于在qsort中排序索引数组

int compare(const void *a, const void *b) {

return (*(int*)a - *(int*)b);

}

// 排序时保持原数组不变的函数

void sortWithoutChangingValues(int arr[], int n) {

// 创建索引数组

int index[n];

for (int i = 0; i < n; i++) {

index[i] = i;

}

// 使用qsort对索引数组进行排序,比较函数为compare

qsort(index, n, sizeof(int), compare);

// 输出排序后的数组

printf("排序后的数组:%

");

for (int i = 0; i < n; i++) {

printf("%d ", arr[index[i]]);

}

}

int main() {

int arr[] = {4, 2, 8, 6, 1};

int n = sizeof(arr) / sizeof(arr[0]);

// 输出原始数组

printf("原始数组:%

");

for (int i = 0; i < n; i++) {

printf("%d ", arr[i]);

}

printf("%

");

// 调用排序函数

sortWithoutChangingValues(arr, n);

return 0;

}

在这个例子中,我们首先创建了一个索引数组,然后使用`qsort`函数对索引数组进行排序,而不是直接对原始数组进行排序。最后,我们通过排序后的索引数组访问原数组,输出排序后的结果,而原始数组的值保持不变。

通过这种方法,我们可以在排序时保持int数组的原始值不变,适用于一些特定场景,如需要记录元素在原数组中的位置等情况。