把数组中负数放在左边零在中间正数放右边

504 篇文章 0 订阅
void swap(int &A, int &B)
{
    int tmp = A;
    A = B;
    B = tmp;
}

void rangeArray(int *Array, int len)
{
    int low   = 0;
    int hight = len-1;
    int zero     = 0;

    //思想是进行两次快速排序
    while(low < hight)
    {
        while (Array[low] <= 0) low++;

        while (Array[hight] > 0) hight--;

        if (low < hight)
        {
            swap(Array[low], Array[hight]);
        }
    }

    low  = 0;
    zero = hight;

    while(low < zero)
    {
        while (Array[low] < 0) low++;
        while (Array[zero] == 0) zero--;

        if (low < zero)
        {
            swap(Array[low], Array[zero]);
        }
    }
}


void rangeArray2(int *arr, int len)
{

    // cur 为当前比较的数字
    // rightBorderNegative 
    // leftBorderPositive

    // 算法
    int rightBorderNegative=0,cur=0,leftBorderPositive=len-1;

    //思想: 若arr[cur]大于0,扔到leftBorderPositive后面; 若arr[cur]小于0,扔到rightBorderNegative前面
    while(mid <= high)
    {
        if (arr[cur]<0)
            swap(arr[rightBorderNegative++],arr[cur++]); //当前比较的数字若小于0,就会被和low置换,就是说low之前的数字都小于0
        else if(arr[cur]==0)
            cur++;
        else
            swap(arr[cur], arr[leftBorderPositive--]); //当前比较的数字若大于0,就会被和hight置换,就是活hight之后的数字都大于0
    }	
}


对于rangeArray2的解题细想,可以延伸 比某个数小的数都在 low之前;比某个数大的数都在 hight 之后;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值