C++将数组非负数移至左侧并升序排列问题求助
数组分隔+排序问题解决
我已经实现将数组中的非负数移至左侧,但无法整合升序排序功能,当前输出为:
1 7 5 11 6 -1 -3 -2
期望输出是:
1 5 6 7 11 -1 -2 -3
即非负数部分升序排列,负数部分按绝对值升序排列。
问题原因
原代码仅完成了非负数与负数的分隔,未对两部分分别进行排序操作。
解决方案
在完成数组分隔后,对非负数区间和负数区间分别执行排序逻辑:
- 先将非负数和负数分别存入临时数组
temp; - 对
temp中前j个元素(非负数)进行升序排序; - 对
temp中从j到末尾的元素(负数)按绝对值升序排序(以匹配期望输出); - 将排序后的
temp数组复制回原数组。
修改后的完整代码
#include<bits/stdc++.h> using namespace std; void segregateElements(int arr[], int n) { int temp[n]; int j = 0; // 记录非负数的数量,也是负数在temp中的起始索引 for (int i = 0; i < n ; i++) if (arr[i] >= 0 ) temp[j++] = arr[i]; if (j == n || j == 0) return; for (int i = 0 ; i < n ; i++) if (arr[i] < 0) temp[j++] = arr[i]; // 对非负数部分进行升序排序(0到j-1) int tg; for(int i = 0; i < j - 1; i++){ for(int k = i + 1; k < j; k++){ if(temp[i] > temp[k]){ tg = temp[i]; temp[i] = temp[k]; temp[k] = tg; } } } // 对负数部分按绝对值升序排序(j到n-1) for(int i = j; i < n - 1; i++){ for(int k = i + 1; k < n; k++){ if(abs(temp[i]) > abs(temp[k])){ tg = temp[i]; temp[i] = temp[k]; temp[k] = tg; } } } memcpy(arr, temp, sizeof(temp)); } int main() { int arr[] = {1 ,-1 ,-3 , -2, 7, 5, 11, 6 }; int n = sizeof(arr)/sizeof(arr[0]); segregateElements(arr, n); for (int i = 0; i < n; i++) cout << arr[i] << " "; return 0; }
代码说明
- 非负数排序:复用你提供的冒泡排序逻辑,仅限定排序范围为非负数所在的区间;
- 负数排序:通过比较绝对值大小,实现按绝对值升序排列,最终得到
-1,-2,-3的结果; - 最后通过
memcpy将排序后的临时数组内容复制回原数组,完成最终的数组转换。
内容的提问来源于stack exchange,提问作者berries
相关产品推荐
相关产品推荐

