数组排序(正数在左,负数在右)

import java.util.Arrays;
/**
 * [1,2,3,-2,-4,5,3,-2,4,1,-5,3]数组排序
 输出结果[1,2,3,5,3,4,1,-2,-4,-2,-5]
 要求:
 1.正数在左,负数在右,
 2.相对顺序不变,
 3.空间复杂度O(1)
 */
public class ArraySort {
    //arr 待排序数组,data 需要插入的数据, dataIndex待插入数据的原始下标
    public static int[] InsertArr(int arr[], int data, int dataIndex){
        for(int index = dataIndex; index < arr.length-1; index++){
            arr[index] = arr[index+1];
        }
        arr[arr.length-1] = data;
        return arr;
    }

    public static void ArrSort(int arr[]){
        boolean flag;
        for(int index = 0; index <arr.length; ){
            //如果一次子循环,没有数据进行交换,则执行index ++,继续向后遍历,但是如果有数据交换就不能index ++了,
            // 因为交换的该位置同样有可能为负数,则需要继续执行是否交换判断逻辑
            flag = false;
            if (arr[index] < 0){
                //从左向右遍历,如果有负数,则看负数后面还有没有正数,如果有正数,则把该负数取出,其后面的数依次前移,该负数插入到数组的最后一位
                for(int minusIndex = index; minusIndex< arr.length; minusIndex++){
                    if (arr[minusIndex] > 0){
                        //将该负数插入到数组的尾部,其余数据依次前移
                        arr = InsertArr(arr, arr[index], index);
                        flag = true;
                        System.out.println(Arrays.toString(arr));
                        break;
                    }
                }
            }
            //如果为真就不执行index++了,继续判断arr[index]是否为负数
            if(flag) continue;
            index++;
        }
    }

    public static void main(String[] args) {
        System.out.println("原始数组排列顺序:");
        int arr[] = {1,2,3,-2,-4,5,3,-2,4,1,-5,3};
        System.out.println(Arrays.toString(arr));
        System.out.println("排列过程:");
        ArrSort(arr);
        System.out.println("数组最后排列结果:");
        System.out.println(Arrays.toString(arr));
    }
}
执行结果:
原始数组排列顺序:
[1, 2, 3, -2, -4, 5, 3, -2, 4, 1, -5, 3]
排列过程:
[1, 2, 3, -4, 5, 3, -2, 4, 1, -5, 3, -2]
[1, 2, 3, 5, 3, -2, 4, 1, -5, 3, -2, -4]
[1, 2, 3, 5, 3, 4, 1, -5, 3, -2, -4, -2]
[1, 2, 3, 5, 3, 4, 1, 3, -2, -4, -2, -5]
数组最后排列结果:
[1, 2, 3, 5, 3, 4, 1, 3, -2, -4, -2, -5]

转载于:https://www.cnblogs.com/lihao7/p/10759621.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值