You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++将数组非负数移至左侧并升序排列问题求助

数组分隔+排序问题解决

我已经实现将数组中的非负数移至左侧,但无法整合升序排序功能,当前输出为:

1 7 5 11 6 -1 -3 -2

期望输出是:

1 5 6 7 11 -1 -2 -3

即非负数部分升序排列,负数部分按绝对值升序排列。

问题原因

原代码仅完成了非负数与负数的分隔,未对两部分分别进行排序操作。

解决方案

在完成数组分隔后,对非负数区间和负数区间分别执行排序逻辑:

  1. 先将非负数和负数分别存入临时数组temp;
  2. 对temp中前j个元素(非负数)进行升序排序;
  3. 对temp中从j到末尾的元素(负数)按绝对值升序排序(以匹配期望输出);
  4. 将排序后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:36:33