如何在不修改原data数组的前提下对C++指针数组排序?
如何排序指针数组而不修改原数据数组
你当前的问题核心是排序时修改了指针指向的原数组元素,而非调整指针数组里的指针顺序。你的SwapIntPtr函数交换的是两个指针指向的int值,这直接修改了data数组的内容,所以原数组和指针数组的输出结果完全一致——因为原数组已经被你排序了。
要实现不修改原数组的排序,你需要交换的是指针数组里的指针本身,而非它们指向的值。具体修改方案如下:
方案1:修改交换函数,实现指针交换
将SwapIntPtr改为交换两个int*类型的指针(需要用指针的指针传递,因为要修改指针变量本身):
static void SwapIntPtr(int** a, int** b) { int* temp = *a; *a = *b; *b = temp; }
然后在Sorting函数中调用时,传入指针数组元素的地址:
static void Sorting(int* ptrarr[], int size) { for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { // 比较指针指向的值,决定是否交换指针 if (*ptrarr[j] > *ptrarr[j + 1]) { SwapIntPtr(&ptrarr[j], &ptrarr[j + 1]); } } } }
方案2:直接在排序函数内交换指针(更简洁)
无需单独的交换函数,直接在排序循环中交换指针数组的元素:
static void Sorting(int* ptrarr[], int size) { for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { if (*ptrarr[j] > *ptrarr[j + 1]) { // 交换指针数组内的指针,不修改原数组内容 int* temp = ptrarr[j]; ptrarr[j] = ptrarr[j + 1]; ptrarr[j + 1] = temp; } } } }
效果验证
修改完成后,DisplayArray会按排序后的指针顺序输出原数组的元素值,而DisplayData输出的是原数组的原始顺序,两者结果不再一致,且原data数组的内容完全未被修改。
内容的提问来源于stack exchange,提问作者ThirstyBob321
相关产品推荐
相关产品推荐

